Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2025-08-28 08:27:06

0001 // Licensed to the Apache Software Foundation (ASF) under one
0002 // or more contributor license agreements.  See the NOTICE file
0003 // distributed with this work for additional information
0004 // regarding copyright ownership.  The ASF licenses this file
0005 // to you under the Apache License, Version 2.0 (the
0006 // "License"); you may not use this file except in compliance
0007 // with the License.  You may obtain a copy of the License at
0008 //
0009 //   http://www.apache.org/licenses/LICENSE-2.0
0010 //
0011 // Unless required by applicable law or agreed to in writing,
0012 // software distributed under the License is distributed on an
0013 // "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
0014 // KIND, either express or implied.  See the License for the
0015 // specific language governing permissions and limitations
0016 // under the License.
0017 
0018 // This file was generated by script which is modified from its original version in
0019 // GitHub. Original source:
0020 // https://github.com/lemire/FrameOfReference/blob/146948b6058a976bc7767262ad3a2ce201486b93/scripts/turbopacking64.py
0021 // The original copyright notice follows.
0022 
0023 // This code is released under the
0024 // Apache License Version 2.0 http://www.apache.org/licenses/.
0025 // (c) Daniel Lemire 2013
0026 
0027 #pragma once
0028 
0029 #include "arrow/util/bit_util.h"
0030 #include "arrow/util/ubsan.h"
0031 
0032 namespace arrow {
0033 namespace internal {
0034 
0035 inline const uint8_t* unpack0_64(const uint8_t* in, uint64_t* out) {
0036   for (int k = 0; k < 32; k += 1) {
0037     out[k] = 0;
0038   }
0039   return in;
0040 }
0041 
0042 inline const uint8_t* unpack1_64(const uint8_t* in, uint64_t* out) {
0043   const uint64_t mask = 1ULL;
0044   uint64_t w0 = util::SafeLoadAs<uint32_t>(in);
0045   w0 = arrow::bit_util::FromLittleEndian(w0);
0046   in += 4;
0047   out[0] = (w0)&mask;
0048   out[1] = (w0 >> 1) & mask;
0049   out[2] = (w0 >> 2) & mask;
0050   out[3] = (w0 >> 3) & mask;
0051   out[4] = (w0 >> 4) & mask;
0052   out[5] = (w0 >> 5) & mask;
0053   out[6] = (w0 >> 6) & mask;
0054   out[7] = (w0 >> 7) & mask;
0055   out[8] = (w0 >> 8) & mask;
0056   out[9] = (w0 >> 9) & mask;
0057   out[10] = (w0 >> 10) & mask;
0058   out[11] = (w0 >> 11) & mask;
0059   out[12] = (w0 >> 12) & mask;
0060   out[13] = (w0 >> 13) & mask;
0061   out[14] = (w0 >> 14) & mask;
0062   out[15] = (w0 >> 15) & mask;
0063   out[16] = (w0 >> 16) & mask;
0064   out[17] = (w0 >> 17) & mask;
0065   out[18] = (w0 >> 18) & mask;
0066   out[19] = (w0 >> 19) & mask;
0067   out[20] = (w0 >> 20) & mask;
0068   out[21] = (w0 >> 21) & mask;
0069   out[22] = (w0 >> 22) & mask;
0070   out[23] = (w0 >> 23) & mask;
0071   out[24] = (w0 >> 24) & mask;
0072   out[25] = (w0 >> 25) & mask;
0073   out[26] = (w0 >> 26) & mask;
0074   out[27] = (w0 >> 27) & mask;
0075   out[28] = (w0 >> 28) & mask;
0076   out[29] = (w0 >> 29) & mask;
0077   out[30] = (w0 >> 30) & mask;
0078   out[31] = (w0 >> 31) & mask;
0079 
0080   return in;
0081 }
0082 
0083 inline const uint8_t* unpack2_64(const uint8_t* in, uint64_t* out) {
0084   const uint64_t mask = 3ULL;
0085   uint64_t w0 = util::SafeLoadAs<uint64_t>(in);
0086   w0 = arrow::bit_util::FromLittleEndian(w0);
0087   in += 8;
0088   out[0] = (w0)&mask;
0089   out[1] = (w0 >> 2) & mask;
0090   out[2] = (w0 >> 4) & mask;
0091   out[3] = (w0 >> 6) & mask;
0092   out[4] = (w0 >> 8) & mask;
0093   out[5] = (w0 >> 10) & mask;
0094   out[6] = (w0 >> 12) & mask;
0095   out[7] = (w0 >> 14) & mask;
0096   out[8] = (w0 >> 16) & mask;
0097   out[9] = (w0 >> 18) & mask;
0098   out[10] = (w0 >> 20) & mask;
0099   out[11] = (w0 >> 22) & mask;
0100   out[12] = (w0 >> 24) & mask;
0101   out[13] = (w0 >> 26) & mask;
0102   out[14] = (w0 >> 28) & mask;
0103   out[15] = (w0 >> 30) & mask;
0104   out[16] = (w0 >> 32) & mask;
0105   out[17] = (w0 >> 34) & mask;
0106   out[18] = (w0 >> 36) & mask;
0107   out[19] = (w0 >> 38) & mask;
0108   out[20] = (w0 >> 40) & mask;
0109   out[21] = (w0 >> 42) & mask;
0110   out[22] = (w0 >> 44) & mask;
0111   out[23] = (w0 >> 46) & mask;
0112   out[24] = (w0 >> 48) & mask;
0113   out[25] = (w0 >> 50) & mask;
0114   out[26] = (w0 >> 52) & mask;
0115   out[27] = (w0 >> 54) & mask;
0116   out[28] = (w0 >> 56) & mask;
0117   out[29] = (w0 >> 58) & mask;
0118   out[30] = (w0 >> 60) & mask;
0119   out[31] = w0 >> 62;
0120 
0121   return in;
0122 }
0123 
0124 inline const uint8_t* unpack3_64(const uint8_t* in, uint64_t* out) {
0125   const uint64_t mask = 7ULL;
0126   uint64_t w0 = util::SafeLoadAs<uint64_t>(in);
0127   w0 = arrow::bit_util::FromLittleEndian(w0);
0128   in += 8;
0129   uint64_t w1 = util::SafeLoadAs<uint32_t>(in);
0130   w1 = arrow::bit_util::FromLittleEndian(w1);
0131   in += 4;
0132   out[0] = (w0)&mask;
0133   out[1] = (w0 >> 3) & mask;
0134   out[2] = (w0 >> 6) & mask;
0135   out[3] = (w0 >> 9) & mask;
0136   out[4] = (w0 >> 12) & mask;
0137   out[5] = (w0 >> 15) & mask;
0138   out[6] = (w0 >> 18) & mask;
0139   out[7] = (w0 >> 21) & mask;
0140   out[8] = (w0 >> 24) & mask;
0141   out[9] = (w0 >> 27) & mask;
0142   out[10] = (w0 >> 30) & mask;
0143   out[11] = (w0 >> 33) & mask;
0144   out[12] = (w0 >> 36) & mask;
0145   out[13] = (w0 >> 39) & mask;
0146   out[14] = (w0 >> 42) & mask;
0147   out[15] = (w0 >> 45) & mask;
0148   out[16] = (w0 >> 48) & mask;
0149   out[17] = (w0 >> 51) & mask;
0150   out[18] = (w0 >> 54) & mask;
0151   out[19] = (w0 >> 57) & mask;
0152   out[20] = (w0 >> 60) & mask;
0153   out[21] = ((w0 >> 63) | (w1 << 1)) & mask;
0154   out[22] = (w1 >> 2) & mask;
0155   out[23] = (w1 >> 5) & mask;
0156   out[24] = (w1 >> 8) & mask;
0157   out[25] = (w1 >> 11) & mask;
0158   out[26] = (w1 >> 14) & mask;
0159   out[27] = (w1 >> 17) & mask;
0160   out[28] = (w1 >> 20) & mask;
0161   out[29] = (w1 >> 23) & mask;
0162   out[30] = (w1 >> 26) & mask;
0163   out[31] = (w1 >> 29) & mask;
0164 
0165   return in;
0166 }
0167 
0168 inline const uint8_t* unpack4_64(const uint8_t* in, uint64_t* out) {
0169   const uint64_t mask = 15ULL;
0170   uint64_t w0 = util::SafeLoadAs<uint64_t>(in);
0171   w0 = arrow::bit_util::FromLittleEndian(w0);
0172   in += 8;
0173   uint64_t w1 = util::SafeLoadAs<uint64_t>(in);
0174   w1 = arrow::bit_util::FromLittleEndian(w1);
0175   in += 8;
0176   out[0] = (w0)&mask;
0177   out[1] = (w0 >> 4) & mask;
0178   out[2] = (w0 >> 8) & mask;
0179   out[3] = (w0 >> 12) & mask;
0180   out[4] = (w0 >> 16) & mask;
0181   out[5] = (w0 >> 20) & mask;
0182   out[6] = (w0 >> 24) & mask;
0183   out[7] = (w0 >> 28) & mask;
0184   out[8] = (w0 >> 32) & mask;
0185   out[9] = (w0 >> 36) & mask;
0186   out[10] = (w0 >> 40) & mask;
0187   out[11] = (w0 >> 44) & mask;
0188   out[12] = (w0 >> 48) & mask;
0189   out[13] = (w0 >> 52) & mask;
0190   out[14] = (w0 >> 56) & mask;
0191   out[15] = w0 >> 60;
0192   out[16] = (w1)&mask;
0193   out[17] = (w1 >> 4) & mask;
0194   out[18] = (w1 >> 8) & mask;
0195   out[19] = (w1 >> 12) & mask;
0196   out[20] = (w1 >> 16) & mask;
0197   out[21] = (w1 >> 20) & mask;
0198   out[22] = (w1 >> 24) & mask;
0199   out[23] = (w1 >> 28) & mask;
0200   out[24] = (w1 >> 32) & mask;
0201   out[25] = (w1 >> 36) & mask;
0202   out[26] = (w1 >> 40) & mask;
0203   out[27] = (w1 >> 44) & mask;
0204   out[28] = (w1 >> 48) & mask;
0205   out[29] = (w1 >> 52) & mask;
0206   out[30] = (w1 >> 56) & mask;
0207   out[31] = w1 >> 60;
0208 
0209   return in;
0210 }
0211 
0212 inline const uint8_t* unpack5_64(const uint8_t* in, uint64_t* out) {
0213   const uint64_t mask = 31ULL;
0214   uint64_t w0 = util::SafeLoadAs<uint64_t>(in);
0215   w0 = arrow::bit_util::FromLittleEndian(w0);
0216   in += 8;
0217   uint64_t w1 = util::SafeLoadAs<uint64_t>(in);
0218   w1 = arrow::bit_util::FromLittleEndian(w1);
0219   in += 8;
0220   uint64_t w2 = util::SafeLoadAs<uint32_t>(in);
0221   w2 = arrow::bit_util::FromLittleEndian(w2);
0222   in += 4;
0223   out[0] = (w0)&mask;
0224   out[1] = (w0 >> 5) & mask;
0225   out[2] = (w0 >> 10) & mask;
0226   out[3] = (w0 >> 15) & mask;
0227   out[4] = (w0 >> 20) & mask;
0228   out[5] = (w0 >> 25) & mask;
0229   out[6] = (w0 >> 30) & mask;
0230   out[7] = (w0 >> 35) & mask;
0231   out[8] = (w0 >> 40) & mask;
0232   out[9] = (w0 >> 45) & mask;
0233   out[10] = (w0 >> 50) & mask;
0234   out[11] = (w0 >> 55) & mask;
0235   out[12] = ((w0 >> 60) | (w1 << 4)) & mask;
0236   out[13] = (w1 >> 1) & mask;
0237   out[14] = (w1 >> 6) & mask;
0238   out[15] = (w1 >> 11) & mask;
0239   out[16] = (w1 >> 16) & mask;
0240   out[17] = (w1 >> 21) & mask;
0241   out[18] = (w1 >> 26) & mask;
0242   out[19] = (w1 >> 31) & mask;
0243   out[20] = (w1 >> 36) & mask;
0244   out[21] = (w1 >> 41) & mask;
0245   out[22] = (w1 >> 46) & mask;
0246   out[23] = (w1 >> 51) & mask;
0247   out[24] = (w1 >> 56) & mask;
0248   out[25] = ((w1 >> 61) | (w2 << 3)) & mask;
0249   out[26] = (w2 >> 2) & mask;
0250   out[27] = (w2 >> 7) & mask;
0251   out[28] = (w2 >> 12) & mask;
0252   out[29] = (w2 >> 17) & mask;
0253   out[30] = (w2 >> 22) & mask;
0254   out[31] = (w2 >> 27) & mask;
0255 
0256   return in;
0257 }
0258 
0259 inline const uint8_t* unpack6_64(const uint8_t* in, uint64_t* out) {
0260   const uint64_t mask = 63ULL;
0261   uint64_t w0 = util::SafeLoadAs<uint64_t>(in);
0262   w0 = arrow::bit_util::FromLittleEndian(w0);
0263   in += 8;
0264   uint64_t w1 = util::SafeLoadAs<uint64_t>(in);
0265   w1 = arrow::bit_util::FromLittleEndian(w1);
0266   in += 8;
0267   uint64_t w2 = util::SafeLoadAs<uint64_t>(in);
0268   w2 = arrow::bit_util::FromLittleEndian(w2);
0269   in += 8;
0270   out[0] = (w0)&mask;
0271   out[1] = (w0 >> 6) & mask;
0272   out[2] = (w0 >> 12) & mask;
0273   out[3] = (w0 >> 18) & mask;
0274   out[4] = (w0 >> 24) & mask;
0275   out[5] = (w0 >> 30) & mask;
0276   out[6] = (w0 >> 36) & mask;
0277   out[7] = (w0 >> 42) & mask;
0278   out[8] = (w0 >> 48) & mask;
0279   out[9] = (w0 >> 54) & mask;
0280   out[10] = ((w0 >> 60) | (w1 << 4)) & mask;
0281   out[11] = (w1 >> 2) & mask;
0282   out[12] = (w1 >> 8) & mask;
0283   out[13] = (w1 >> 14) & mask;
0284   out[14] = (w1 >> 20) & mask;
0285   out[15] = (w1 >> 26) & mask;
0286   out[16] = (w1 >> 32) & mask;
0287   out[17] = (w1 >> 38) & mask;
0288   out[18] = (w1 >> 44) & mask;
0289   out[19] = (w1 >> 50) & mask;
0290   out[20] = (w1 >> 56) & mask;
0291   out[21] = ((w1 >> 62) | (w2 << 2)) & mask;
0292   out[22] = (w2 >> 4) & mask;
0293   out[23] = (w2 >> 10) & mask;
0294   out[24] = (w2 >> 16) & mask;
0295   out[25] = (w2 >> 22) & mask;
0296   out[26] = (w2 >> 28) & mask;
0297   out[27] = (w2 >> 34) & mask;
0298   out[28] = (w2 >> 40) & mask;
0299   out[29] = (w2 >> 46) & mask;
0300   out[30] = (w2 >> 52) & mask;
0301   out[31] = w2 >> 58;
0302 
0303   return in;
0304 }
0305 
0306 inline const uint8_t* unpack7_64(const uint8_t* in, uint64_t* out) {
0307   const uint64_t mask = 127ULL;
0308   uint64_t w0 = util::SafeLoadAs<uint64_t>(in);
0309   w0 = arrow::bit_util::FromLittleEndian(w0);
0310   in += 8;
0311   uint64_t w1 = util::SafeLoadAs<uint64_t>(in);
0312   w1 = arrow::bit_util::FromLittleEndian(w1);
0313   in += 8;
0314   uint64_t w2 = util::SafeLoadAs<uint64_t>(in);
0315   w2 = arrow::bit_util::FromLittleEndian(w2);
0316   in += 8;
0317   uint64_t w3 = util::SafeLoadAs<uint32_t>(in);
0318   w3 = arrow::bit_util::FromLittleEndian(w3);
0319   in += 4;
0320   out[0] = (w0)&mask;
0321   out[1] = (w0 >> 7) & mask;
0322   out[2] = (w0 >> 14) & mask;
0323   out[3] = (w0 >> 21) & mask;
0324   out[4] = (w0 >> 28) & mask;
0325   out[5] = (w0 >> 35) & mask;
0326   out[6] = (w0 >> 42) & mask;
0327   out[7] = (w0 >> 49) & mask;
0328   out[8] = (w0 >> 56) & mask;
0329   out[9] = ((w0 >> 63) | (w1 << 1)) & mask;
0330   out[10] = (w1 >> 6) & mask;
0331   out[11] = (w1 >> 13) & mask;
0332   out[12] = (w1 >> 20) & mask;
0333   out[13] = (w1 >> 27) & mask;
0334   out[14] = (w1 >> 34) & mask;
0335   out[15] = (w1 >> 41) & mask;
0336   out[16] = (w1 >> 48) & mask;
0337   out[17] = (w1 >> 55) & mask;
0338   out[18] = ((w1 >> 62) | (w2 << 2)) & mask;
0339   out[19] = (w2 >> 5) & mask;
0340   out[20] = (w2 >> 12) & mask;
0341   out[21] = (w2 >> 19) & mask;
0342   out[22] = (w2 >> 26) & mask;
0343   out[23] = (w2 >> 33) & mask;
0344   out[24] = (w2 >> 40) & mask;
0345   out[25] = (w2 >> 47) & mask;
0346   out[26] = (w2 >> 54) & mask;
0347   out[27] = ((w2 >> 61) | (w3 << 3)) & mask;
0348   out[28] = (w3 >> 4) & mask;
0349   out[29] = (w3 >> 11) & mask;
0350   out[30] = (w3 >> 18) & mask;
0351   out[31] = (w3 >> 25) & mask;
0352 
0353   return in;
0354 }
0355 
0356 inline const uint8_t* unpack8_64(const uint8_t* in, uint64_t* out) {
0357   const uint64_t mask = 255ULL;
0358   uint64_t w0 = util::SafeLoadAs<uint64_t>(in);
0359   w0 = arrow::bit_util::FromLittleEndian(w0);
0360   in += 8;
0361   uint64_t w1 = util::SafeLoadAs<uint64_t>(in);
0362   w1 = arrow::bit_util::FromLittleEndian(w1);
0363   in += 8;
0364   uint64_t w2 = util::SafeLoadAs<uint64_t>(in);
0365   w2 = arrow::bit_util::FromLittleEndian(w2);
0366   in += 8;
0367   uint64_t w3 = util::SafeLoadAs<uint64_t>(in);
0368   w3 = arrow::bit_util::FromLittleEndian(w3);
0369   in += 8;
0370   out[0] = (w0)&mask;
0371   out[1] = (w0 >> 8) & mask;
0372   out[2] = (w0 >> 16) & mask;
0373   out[3] = (w0 >> 24) & mask;
0374   out[4] = (w0 >> 32) & mask;
0375   out[5] = (w0 >> 40) & mask;
0376   out[6] = (w0 >> 48) & mask;
0377   out[7] = w0 >> 56;
0378   out[8] = (w1)&mask;
0379   out[9] = (w1 >> 8) & mask;
0380   out[10] = (w1 >> 16) & mask;
0381   out[11] = (w1 >> 24) & mask;
0382   out[12] = (w1 >> 32) & mask;
0383   out[13] = (w1 >> 40) & mask;
0384   out[14] = (w1 >> 48) & mask;
0385   out[15] = w1 >> 56;
0386   out[16] = (w2)&mask;
0387   out[17] = (w2 >> 8) & mask;
0388   out[18] = (w2 >> 16) & mask;
0389   out[19] = (w2 >> 24) & mask;
0390   out[20] = (w2 >> 32) & mask;
0391   out[21] = (w2 >> 40) & mask;
0392   out[22] = (w2 >> 48) & mask;
0393   out[23] = w2 >> 56;
0394   out[24] = (w3)&mask;
0395   out[25] = (w3 >> 8) & mask;
0396   out[26] = (w3 >> 16) & mask;
0397   out[27] = (w3 >> 24) & mask;
0398   out[28] = (w3 >> 32) & mask;
0399   out[29] = (w3 >> 40) & mask;
0400   out[30] = (w3 >> 48) & mask;
0401   out[31] = w3 >> 56;
0402 
0403   return in;
0404 }
0405 
0406 inline const uint8_t* unpack9_64(const uint8_t* in, uint64_t* out) {
0407   const uint64_t mask = 511ULL;
0408   uint64_t w0 = util::SafeLoadAs<uint64_t>(in);
0409   w0 = arrow::bit_util::FromLittleEndian(w0);
0410   in += 8;
0411   uint64_t w1 = util::SafeLoadAs<uint64_t>(in);
0412   w1 = arrow::bit_util::FromLittleEndian(w1);
0413   in += 8;
0414   uint64_t w2 = util::SafeLoadAs<uint64_t>(in);
0415   w2 = arrow::bit_util::FromLittleEndian(w2);
0416   in += 8;
0417   uint64_t w3 = util::SafeLoadAs<uint64_t>(in);
0418   w3 = arrow::bit_util::FromLittleEndian(w3);
0419   in += 8;
0420   uint64_t w4 = util::SafeLoadAs<uint32_t>(in);
0421   w4 = arrow::bit_util::FromLittleEndian(w4);
0422   in += 4;
0423   out[0] = (w0)&mask;
0424   out[1] = (w0 >> 9) & mask;
0425   out[2] = (w0 >> 18) & mask;
0426   out[3] = (w0 >> 27) & mask;
0427   out[4] = (w0 >> 36) & mask;
0428   out[5] = (w0 >> 45) & mask;
0429   out[6] = (w0 >> 54) & mask;
0430   out[7] = ((w0 >> 63) | (w1 << 1)) & mask;
0431   out[8] = (w1 >> 8) & mask;
0432   out[9] = (w1 >> 17) & mask;
0433   out[10] = (w1 >> 26) & mask;
0434   out[11] = (w1 >> 35) & mask;
0435   out[12] = (w1 >> 44) & mask;
0436   out[13] = (w1 >> 53) & mask;
0437   out[14] = ((w1 >> 62) | (w2 << 2)) & mask;
0438   out[15] = (w2 >> 7) & mask;
0439   out[16] = (w2 >> 16) & mask;
0440   out[17] = (w2 >> 25) & mask;
0441   out[18] = (w2 >> 34) & mask;
0442   out[19] = (w2 >> 43) & mask;
0443   out[20] = (w2 >> 52) & mask;
0444   out[21] = ((w2 >> 61) | (w3 << 3)) & mask;
0445   out[22] = (w3 >> 6) & mask;
0446   out[23] = (w3 >> 15) & mask;
0447   out[24] = (w3 >> 24) & mask;
0448   out[25] = (w3 >> 33) & mask;
0449   out[26] = (w3 >> 42) & mask;
0450   out[27] = (w3 >> 51) & mask;
0451   out[28] = ((w3 >> 60) | (w4 << 4)) & mask;
0452   out[29] = (w4 >> 5) & mask;
0453   out[30] = (w4 >> 14) & mask;
0454   out[31] = (w4 >> 23) & mask;
0455 
0456   return in;
0457 }
0458 
0459 inline const uint8_t* unpack10_64(const uint8_t* in, uint64_t* out) {
0460   const uint64_t mask = 1023ULL;
0461   uint64_t w0 = util::SafeLoadAs<uint64_t>(in);
0462   w0 = arrow::bit_util::FromLittleEndian(w0);
0463   in += 8;
0464   uint64_t w1 = util::SafeLoadAs<uint64_t>(in);
0465   w1 = arrow::bit_util::FromLittleEndian(w1);
0466   in += 8;
0467   uint64_t w2 = util::SafeLoadAs<uint64_t>(in);
0468   w2 = arrow::bit_util::FromLittleEndian(w2);
0469   in += 8;
0470   uint64_t w3 = util::SafeLoadAs<uint64_t>(in);
0471   w3 = arrow::bit_util::FromLittleEndian(w3);
0472   in += 8;
0473   uint64_t w4 = util::SafeLoadAs<uint64_t>(in);
0474   w4 = arrow::bit_util::FromLittleEndian(w4);
0475   in += 8;
0476   out[0] = (w0)&mask;
0477   out[1] = (w0 >> 10) & mask;
0478   out[2] = (w0 >> 20) & mask;
0479   out[3] = (w0 >> 30) & mask;
0480   out[4] = (w0 >> 40) & mask;
0481   out[5] = (w0 >> 50) & mask;
0482   out[6] = ((w0 >> 60) | (w1 << 4)) & mask;
0483   out[7] = (w1 >> 6) & mask;
0484   out[8] = (w1 >> 16) & mask;
0485   out[9] = (w1 >> 26) & mask;
0486   out[10] = (w1 >> 36) & mask;
0487   out[11] = (w1 >> 46) & mask;
0488   out[12] = ((w1 >> 56) | (w2 << 8)) & mask;
0489   out[13] = (w2 >> 2) & mask;
0490   out[14] = (w2 >> 12) & mask;
0491   out[15] = (w2 >> 22) & mask;
0492   out[16] = (w2 >> 32) & mask;
0493   out[17] = (w2 >> 42) & mask;
0494   out[18] = (w2 >> 52) & mask;
0495   out[19] = ((w2 >> 62) | (w3 << 2)) & mask;
0496   out[20] = (w3 >> 8) & mask;
0497   out[21] = (w3 >> 18) & mask;
0498   out[22] = (w3 >> 28) & mask;
0499   out[23] = (w3 >> 38) & mask;
0500   out[24] = (w3 >> 48) & mask;
0501   out[25] = ((w3 >> 58) | (w4 << 6)) & mask;
0502   out[26] = (w4 >> 4) & mask;
0503   out[27] = (w4 >> 14) & mask;
0504   out[28] = (w4 >> 24) & mask;
0505   out[29] = (w4 >> 34) & mask;
0506   out[30] = (w4 >> 44) & mask;
0507   out[31] = w4 >> 54;
0508 
0509   return in;
0510 }
0511 
0512 inline const uint8_t* unpack11_64(const uint8_t* in, uint64_t* out) {
0513   const uint64_t mask = 2047ULL;
0514   uint64_t w0 = util::SafeLoadAs<uint64_t>(in);
0515   w0 = arrow::bit_util::FromLittleEndian(w0);
0516   in += 8;
0517   uint64_t w1 = util::SafeLoadAs<uint64_t>(in);
0518   w1 = arrow::bit_util::FromLittleEndian(w1);
0519   in += 8;
0520   uint64_t w2 = util::SafeLoadAs<uint64_t>(in);
0521   w2 = arrow::bit_util::FromLittleEndian(w2);
0522   in += 8;
0523   uint64_t w3 = util::SafeLoadAs<uint64_t>(in);
0524   w3 = arrow::bit_util::FromLittleEndian(w3);
0525   in += 8;
0526   uint64_t w4 = util::SafeLoadAs<uint64_t>(in);
0527   w4 = arrow::bit_util::FromLittleEndian(w4);
0528   in += 8;
0529   uint64_t w5 = util::SafeLoadAs<uint32_t>(in);
0530   w5 = arrow::bit_util::FromLittleEndian(w5);
0531   in += 4;
0532   out[0] = (w0)&mask;
0533   out[1] = (w0 >> 11) & mask;
0534   out[2] = (w0 >> 22) & mask;
0535   out[3] = (w0 >> 33) & mask;
0536   out[4] = (w0 >> 44) & mask;
0537   out[5] = ((w0 >> 55) | (w1 << 9)) & mask;
0538   out[6] = (w1 >> 2) & mask;
0539   out[7] = (w1 >> 13) & mask;
0540   out[8] = (w1 >> 24) & mask;
0541   out[9] = (w1 >> 35) & mask;
0542   out[10] = (w1 >> 46) & mask;
0543   out[11] = ((w1 >> 57) | (w2 << 7)) & mask;
0544   out[12] = (w2 >> 4) & mask;
0545   out[13] = (w2 >> 15) & mask;
0546   out[14] = (w2 >> 26) & mask;
0547   out[15] = (w2 >> 37) & mask;
0548   out[16] = (w2 >> 48) & mask;
0549   out[17] = ((w2 >> 59) | (w3 << 5)) & mask;
0550   out[18] = (w3 >> 6) & mask;
0551   out[19] = (w3 >> 17) & mask;
0552   out[20] = (w3 >> 28) & mask;
0553   out[21] = (w3 >> 39) & mask;
0554   out[22] = (w3 >> 50) & mask;
0555   out[23] = ((w3 >> 61) | (w4 << 3)) & mask;
0556   out[24] = (w4 >> 8) & mask;
0557   out[25] = (w4 >> 19) & mask;
0558   out[26] = (w4 >> 30) & mask;
0559   out[27] = (w4 >> 41) & mask;
0560   out[28] = (w4 >> 52) & mask;
0561   out[29] = ((w4 >> 63) | (w5 << 1)) & mask;
0562   out[30] = (w5 >> 10) & mask;
0563   out[31] = (w5 >> 21) & mask;
0564 
0565   return in;
0566 }
0567 
0568 inline const uint8_t* unpack12_64(const uint8_t* in, uint64_t* out) {
0569   const uint64_t mask = 4095ULL;
0570   uint64_t w0 = util::SafeLoadAs<uint64_t>(in);
0571   w0 = arrow::bit_util::FromLittleEndian(w0);
0572   in += 8;
0573   uint64_t w1 = util::SafeLoadAs<uint64_t>(in);
0574   w1 = arrow::bit_util::FromLittleEndian(w1);
0575   in += 8;
0576   uint64_t w2 = util::SafeLoadAs<uint64_t>(in);
0577   w2 = arrow::bit_util::FromLittleEndian(w2);
0578   in += 8;
0579   uint64_t w3 = util::SafeLoadAs<uint64_t>(in);
0580   w3 = arrow::bit_util::FromLittleEndian(w3);
0581   in += 8;
0582   uint64_t w4 = util::SafeLoadAs<uint64_t>(in);
0583   w4 = arrow::bit_util::FromLittleEndian(w4);
0584   in += 8;
0585   uint64_t w5 = util::SafeLoadAs<uint64_t>(in);
0586   w5 = arrow::bit_util::FromLittleEndian(w5);
0587   in += 8;
0588   out[0] = (w0)&mask;
0589   out[1] = (w0 >> 12) & mask;
0590   out[2] = (w0 >> 24) & mask;
0591   out[3] = (w0 >> 36) & mask;
0592   out[4] = (w0 >> 48) & mask;
0593   out[5] = ((w0 >> 60) | (w1 << 4)) & mask;
0594   out[6] = (w1 >> 8) & mask;
0595   out[7] = (w1 >> 20) & mask;
0596   out[8] = (w1 >> 32) & mask;
0597   out[9] = (w1 >> 44) & mask;
0598   out[10] = ((w1 >> 56) | (w2 << 8)) & mask;
0599   out[11] = (w2 >> 4) & mask;
0600   out[12] = (w2 >> 16) & mask;
0601   out[13] = (w2 >> 28) & mask;
0602   out[14] = (w2 >> 40) & mask;
0603   out[15] = w2 >> 52;
0604   out[16] = (w3)&mask;
0605   out[17] = (w3 >> 12) & mask;
0606   out[18] = (w3 >> 24) & mask;
0607   out[19] = (w3 >> 36) & mask;
0608   out[20] = (w3 >> 48) & mask;
0609   out[21] = ((w3 >> 60) | (w4 << 4)) & mask;
0610   out[22] = (w4 >> 8) & mask;
0611   out[23] = (w4 >> 20) & mask;
0612   out[24] = (w4 >> 32) & mask;
0613   out[25] = (w4 >> 44) & mask;
0614   out[26] = ((w4 >> 56) | (w5 << 8)) & mask;
0615   out[27] = (w5 >> 4) & mask;
0616   out[28] = (w5 >> 16) & mask;
0617   out[29] = (w5 >> 28) & mask;
0618   out[30] = (w5 >> 40) & mask;
0619   out[31] = w5 >> 52;
0620 
0621   return in;
0622 }
0623 
0624 inline const uint8_t* unpack13_64(const uint8_t* in, uint64_t* out) {
0625   const uint64_t mask = 8191ULL;
0626   uint64_t w0 = util::SafeLoadAs<uint64_t>(in);
0627   w0 = arrow::bit_util::FromLittleEndian(w0);
0628   in += 8;
0629   uint64_t w1 = util::SafeLoadAs<uint64_t>(in);
0630   w1 = arrow::bit_util::FromLittleEndian(w1);
0631   in += 8;
0632   uint64_t w2 = util::SafeLoadAs<uint64_t>(in);
0633   w2 = arrow::bit_util::FromLittleEndian(w2);
0634   in += 8;
0635   uint64_t w3 = util::SafeLoadAs<uint64_t>(in);
0636   w3 = arrow::bit_util::FromLittleEndian(w3);
0637   in += 8;
0638   uint64_t w4 = util::SafeLoadAs<uint64_t>(in);
0639   w4 = arrow::bit_util::FromLittleEndian(w4);
0640   in += 8;
0641   uint64_t w5 = util::SafeLoadAs<uint64_t>(in);
0642   w5 = arrow::bit_util::FromLittleEndian(w5);
0643   in += 8;
0644   uint64_t w6 = util::SafeLoadAs<uint32_t>(in);
0645   w6 = arrow::bit_util::FromLittleEndian(w6);
0646   in += 4;
0647   out[0] = (w0)&mask;
0648   out[1] = (w0 >> 13) & mask;
0649   out[2] = (w0 >> 26) & mask;
0650   out[3] = (w0 >> 39) & mask;
0651   out[4] = ((w0 >> 52) | (w1 << 12)) & mask;
0652   out[5] = (w1 >> 1) & mask;
0653   out[6] = (w1 >> 14) & mask;
0654   out[7] = (w1 >> 27) & mask;
0655   out[8] = (w1 >> 40) & mask;
0656   out[9] = ((w1 >> 53) | (w2 << 11)) & mask;
0657   out[10] = (w2 >> 2) & mask;
0658   out[11] = (w2 >> 15) & mask;
0659   out[12] = (w2 >> 28) & mask;
0660   out[13] = (w2 >> 41) & mask;
0661   out[14] = ((w2 >> 54) | (w3 << 10)) & mask;
0662   out[15] = (w3 >> 3) & mask;
0663   out[16] = (w3 >> 16) & mask;
0664   out[17] = (w3 >> 29) & mask;
0665   out[18] = (w3 >> 42) & mask;
0666   out[19] = ((w3 >> 55) | (w4 << 9)) & mask;
0667   out[20] = (w4 >> 4) & mask;
0668   out[21] = (w4 >> 17) & mask;
0669   out[22] = (w4 >> 30) & mask;
0670   out[23] = (w4 >> 43) & mask;
0671   out[24] = ((w4 >> 56) | (w5 << 8)) & mask;
0672   out[25] = (w5 >> 5) & mask;
0673   out[26] = (w5 >> 18) & mask;
0674   out[27] = (w5 >> 31) & mask;
0675   out[28] = (w5 >> 44) & mask;
0676   out[29] = ((w5 >> 57) | (w6 << 7)) & mask;
0677   out[30] = (w6 >> 6) & mask;
0678   out[31] = (w6 >> 19) & mask;
0679 
0680   return in;
0681 }
0682 
0683 inline const uint8_t* unpack14_64(const uint8_t* in, uint64_t* out) {
0684   const uint64_t mask = 16383ULL;
0685   uint64_t w0 = util::SafeLoadAs<uint64_t>(in);
0686   w0 = arrow::bit_util::FromLittleEndian(w0);
0687   in += 8;
0688   uint64_t w1 = util::SafeLoadAs<uint64_t>(in);
0689   w1 = arrow::bit_util::FromLittleEndian(w1);
0690   in += 8;
0691   uint64_t w2 = util::SafeLoadAs<uint64_t>(in);
0692   w2 = arrow::bit_util::FromLittleEndian(w2);
0693   in += 8;
0694   uint64_t w3 = util::SafeLoadAs<uint64_t>(in);
0695   w3 = arrow::bit_util::FromLittleEndian(w3);
0696   in += 8;
0697   uint64_t w4 = util::SafeLoadAs<uint64_t>(in);
0698   w4 = arrow::bit_util::FromLittleEndian(w4);
0699   in += 8;
0700   uint64_t w5 = util::SafeLoadAs<uint64_t>(in);
0701   w5 = arrow::bit_util::FromLittleEndian(w5);
0702   in += 8;
0703   uint64_t w6 = util::SafeLoadAs<uint64_t>(in);
0704   w6 = arrow::bit_util::FromLittleEndian(w6);
0705   in += 8;
0706   out[0] = (w0)&mask;
0707   out[1] = (w0 >> 14) & mask;
0708   out[2] = (w0 >> 28) & mask;
0709   out[3] = (w0 >> 42) & mask;
0710   out[4] = ((w0 >> 56) | (w1 << 8)) & mask;
0711   out[5] = (w1 >> 6) & mask;
0712   out[6] = (w1 >> 20) & mask;
0713   out[7] = (w1 >> 34) & mask;
0714   out[8] = (w1 >> 48) & mask;
0715   out[9] = ((w1 >> 62) | (w2 << 2)) & mask;
0716   out[10] = (w2 >> 12) & mask;
0717   out[11] = (w2 >> 26) & mask;
0718   out[12] = (w2 >> 40) & mask;
0719   out[13] = ((w2 >> 54) | (w3 << 10)) & mask;
0720   out[14] = (w3 >> 4) & mask;
0721   out[15] = (w3 >> 18) & mask;
0722   out[16] = (w3 >> 32) & mask;
0723   out[17] = (w3 >> 46) & mask;
0724   out[18] = ((w3 >> 60) | (w4 << 4)) & mask;
0725   out[19] = (w4 >> 10) & mask;
0726   out[20] = (w4 >> 24) & mask;
0727   out[21] = (w4 >> 38) & mask;
0728   out[22] = ((w4 >> 52) | (w5 << 12)) & mask;
0729   out[23] = (w5 >> 2) & mask;
0730   out[24] = (w5 >> 16) & mask;
0731   out[25] = (w5 >> 30) & mask;
0732   out[26] = (w5 >> 44) & mask;
0733   out[27] = ((w5 >> 58) | (w6 << 6)) & mask;
0734   out[28] = (w6 >> 8) & mask;
0735   out[29] = (w6 >> 22) & mask;
0736   out[30] = (w6 >> 36) & mask;
0737   out[31] = w6 >> 50;
0738 
0739   return in;
0740 }
0741 
0742 inline const uint8_t* unpack15_64(const uint8_t* in, uint64_t* out) {
0743   const uint64_t mask = 32767ULL;
0744   uint64_t w0 = util::SafeLoadAs<uint64_t>(in);
0745   w0 = arrow::bit_util::FromLittleEndian(w0);
0746   in += 8;
0747   uint64_t w1 = util::SafeLoadAs<uint64_t>(in);
0748   w1 = arrow::bit_util::FromLittleEndian(w1);
0749   in += 8;
0750   uint64_t w2 = util::SafeLoadAs<uint64_t>(in);
0751   w2 = arrow::bit_util::FromLittleEndian(w2);
0752   in += 8;
0753   uint64_t w3 = util::SafeLoadAs<uint64_t>(in);
0754   w3 = arrow::bit_util::FromLittleEndian(w3);
0755   in += 8;
0756   uint64_t w4 = util::SafeLoadAs<uint64_t>(in);
0757   w4 = arrow::bit_util::FromLittleEndian(w4);
0758   in += 8;
0759   uint64_t w5 = util::SafeLoadAs<uint64_t>(in);
0760   w5 = arrow::bit_util::FromLittleEndian(w5);
0761   in += 8;
0762   uint64_t w6 = util::SafeLoadAs<uint64_t>(in);
0763   w6 = arrow::bit_util::FromLittleEndian(w6);
0764   in += 8;
0765   uint64_t w7 = util::SafeLoadAs<uint32_t>(in);
0766   w7 = arrow::bit_util::FromLittleEndian(w7);
0767   in += 4;
0768   out[0] = (w0)&mask;
0769   out[1] = (w0 >> 15) & mask;
0770   out[2] = (w0 >> 30) & mask;
0771   out[3] = (w0 >> 45) & mask;
0772   out[4] = ((w0 >> 60) | (w1 << 4)) & mask;
0773   out[5] = (w1 >> 11) & mask;
0774   out[6] = (w1 >> 26) & mask;
0775   out[7] = (w1 >> 41) & mask;
0776   out[8] = ((w1 >> 56) | (w2 << 8)) & mask;
0777   out[9] = (w2 >> 7) & mask;
0778   out[10] = (w2 >> 22) & mask;
0779   out[11] = (w2 >> 37) & mask;
0780   out[12] = ((w2 >> 52) | (w3 << 12)) & mask;
0781   out[13] = (w3 >> 3) & mask;
0782   out[14] = (w3 >> 18) & mask;
0783   out[15] = (w3 >> 33) & mask;
0784   out[16] = (w3 >> 48) & mask;
0785   out[17] = ((w3 >> 63) | (w4 << 1)) & mask;
0786   out[18] = (w4 >> 14) & mask;
0787   out[19] = (w4 >> 29) & mask;
0788   out[20] = (w4 >> 44) & mask;
0789   out[21] = ((w4 >> 59) | (w5 << 5)) & mask;
0790   out[22] = (w5 >> 10) & mask;
0791   out[23] = (w5 >> 25) & mask;
0792   out[24] = (w5 >> 40) & mask;
0793   out[25] = ((w5 >> 55) | (w6 << 9)) & mask;
0794   out[26] = (w6 >> 6) & mask;
0795   out[27] = (w6 >> 21) & mask;
0796   out[28] = (w6 >> 36) & mask;
0797   out[29] = ((w6 >> 51) | (w7 << 13)) & mask;
0798   out[30] = (w7 >> 2) & mask;
0799   out[31] = (w7 >> 17) & mask;
0800 
0801   return in;
0802 }
0803 
0804 inline const uint8_t* unpack16_64(const uint8_t* in, uint64_t* out) {
0805   const uint64_t mask = 65535ULL;
0806   uint64_t w0 = util::SafeLoadAs<uint64_t>(in);
0807   w0 = arrow::bit_util::FromLittleEndian(w0);
0808   in += 8;
0809   uint64_t w1 = util::SafeLoadAs<uint64_t>(in);
0810   w1 = arrow::bit_util::FromLittleEndian(w1);
0811   in += 8;
0812   uint64_t w2 = util::SafeLoadAs<uint64_t>(in);
0813   w2 = arrow::bit_util::FromLittleEndian(w2);
0814   in += 8;
0815   uint64_t w3 = util::SafeLoadAs<uint64_t>(in);
0816   w3 = arrow::bit_util::FromLittleEndian(w3);
0817   in += 8;
0818   uint64_t w4 = util::SafeLoadAs<uint64_t>(in);
0819   w4 = arrow::bit_util::FromLittleEndian(w4);
0820   in += 8;
0821   uint64_t w5 = util::SafeLoadAs<uint64_t>(in);
0822   w5 = arrow::bit_util::FromLittleEndian(w5);
0823   in += 8;
0824   uint64_t w6 = util::SafeLoadAs<uint64_t>(in);
0825   w6 = arrow::bit_util::FromLittleEndian(w6);
0826   in += 8;
0827   uint64_t w7 = util::SafeLoadAs<uint64_t>(in);
0828   w7 = arrow::bit_util::FromLittleEndian(w7);
0829   in += 8;
0830   out[0] = (w0)&mask;
0831   out[1] = (w0 >> 16) & mask;
0832   out[2] = (w0 >> 32) & mask;
0833   out[3] = w0 >> 48;
0834   out[4] = (w1)&mask;
0835   out[5] = (w1 >> 16) & mask;
0836   out[6] = (w1 >> 32) & mask;
0837   out[7] = w1 >> 48;
0838   out[8] = (w2)&mask;
0839   out[9] = (w2 >> 16) & mask;
0840   out[10] = (w2 >> 32) & mask;
0841   out[11] = w2 >> 48;
0842   out[12] = (w3)&mask;
0843   out[13] = (w3 >> 16) & mask;
0844   out[14] = (w3 >> 32) & mask;
0845   out[15] = w3 >> 48;
0846   out[16] = (w4)&mask;
0847   out[17] = (w4 >> 16) & mask;
0848   out[18] = (w4 >> 32) & mask;
0849   out[19] = w4 >> 48;
0850   out[20] = (w5)&mask;
0851   out[21] = (w5 >> 16) & mask;
0852   out[22] = (w5 >> 32) & mask;
0853   out[23] = w5 >> 48;
0854   out[24] = (w6)&mask;
0855   out[25] = (w6 >> 16) & mask;
0856   out[26] = (w6 >> 32) & mask;
0857   out[27] = w6 >> 48;
0858   out[28] = (w7)&mask;
0859   out[29] = (w7 >> 16) & mask;
0860   out[30] = (w7 >> 32) & mask;
0861   out[31] = w7 >> 48;
0862 
0863   return in;
0864 }
0865 
0866 inline const uint8_t* unpack17_64(const uint8_t* in, uint64_t* out) {
0867   const uint64_t mask = 131071ULL;
0868   uint64_t w0 = util::SafeLoadAs<uint64_t>(in);
0869   w0 = arrow::bit_util::FromLittleEndian(w0);
0870   in += 8;
0871   uint64_t w1 = util::SafeLoadAs<uint64_t>(in);
0872   w1 = arrow::bit_util::FromLittleEndian(w1);
0873   in += 8;
0874   uint64_t w2 = util::SafeLoadAs<uint64_t>(in);
0875   w2 = arrow::bit_util::FromLittleEndian(w2);
0876   in += 8;
0877   uint64_t w3 = util::SafeLoadAs<uint64_t>(in);
0878   w3 = arrow::bit_util::FromLittleEndian(w3);
0879   in += 8;
0880   uint64_t w4 = util::SafeLoadAs<uint64_t>(in);
0881   w4 = arrow::bit_util::FromLittleEndian(w4);
0882   in += 8;
0883   uint64_t w5 = util::SafeLoadAs<uint64_t>(in);
0884   w5 = arrow::bit_util::FromLittleEndian(w5);
0885   in += 8;
0886   uint64_t w6 = util::SafeLoadAs<uint64_t>(in);
0887   w6 = arrow::bit_util::FromLittleEndian(w6);
0888   in += 8;
0889   uint64_t w7 = util::SafeLoadAs<uint64_t>(in);
0890   w7 = arrow::bit_util::FromLittleEndian(w7);
0891   in += 8;
0892   uint64_t w8 = util::SafeLoadAs<uint32_t>(in);
0893   w8 = arrow::bit_util::FromLittleEndian(w8);
0894   in += 4;
0895   out[0] = (w0)&mask;
0896   out[1] = (w0 >> 17) & mask;
0897   out[2] = (w0 >> 34) & mask;
0898   out[3] = ((w0 >> 51) | (w1 << 13)) & mask;
0899   out[4] = (w1 >> 4) & mask;
0900   out[5] = (w1 >> 21) & mask;
0901   out[6] = (w1 >> 38) & mask;
0902   out[7] = ((w1 >> 55) | (w2 << 9)) & mask;
0903   out[8] = (w2 >> 8) & mask;
0904   out[9] = (w2 >> 25) & mask;
0905   out[10] = (w2 >> 42) & mask;
0906   out[11] = ((w2 >> 59) | (w3 << 5)) & mask;
0907   out[12] = (w3 >> 12) & mask;
0908   out[13] = (w3 >> 29) & mask;
0909   out[14] = (w3 >> 46) & mask;
0910   out[15] = ((w3 >> 63) | (w4 << 1)) & mask;
0911   out[16] = (w4 >> 16) & mask;
0912   out[17] = (w4 >> 33) & mask;
0913   out[18] = ((w4 >> 50) | (w5 << 14)) & mask;
0914   out[19] = (w5 >> 3) & mask;
0915   out[20] = (w5 >> 20) & mask;
0916   out[21] = (w5 >> 37) & mask;
0917   out[22] = ((w5 >> 54) | (w6 << 10)) & mask;
0918   out[23] = (w6 >> 7) & mask;
0919   out[24] = (w6 >> 24) & mask;
0920   out[25] = (w6 >> 41) & mask;
0921   out[26] = ((w6 >> 58) | (w7 << 6)) & mask;
0922   out[27] = (w7 >> 11) & mask;
0923   out[28] = (w7 >> 28) & mask;
0924   out[29] = (w7 >> 45) & mask;
0925   out[30] = ((w7 >> 62) | (w8 << 2)) & mask;
0926   out[31] = (w8 >> 15) & mask;
0927 
0928   return in;
0929 }
0930 
0931 inline const uint8_t* unpack18_64(const uint8_t* in, uint64_t* out) {
0932   const uint64_t mask = 262143ULL;
0933   uint64_t w0 = util::SafeLoadAs<uint64_t>(in);
0934   w0 = arrow::bit_util::FromLittleEndian(w0);
0935   in += 8;
0936   uint64_t w1 = util::SafeLoadAs<uint64_t>(in);
0937   w1 = arrow::bit_util::FromLittleEndian(w1);
0938   in += 8;
0939   uint64_t w2 = util::SafeLoadAs<uint64_t>(in);
0940   w2 = arrow::bit_util::FromLittleEndian(w2);
0941   in += 8;
0942   uint64_t w3 = util::SafeLoadAs<uint64_t>(in);
0943   w3 = arrow::bit_util::FromLittleEndian(w3);
0944   in += 8;
0945   uint64_t w4 = util::SafeLoadAs<uint64_t>(in);
0946   w4 = arrow::bit_util::FromLittleEndian(w4);
0947   in += 8;
0948   uint64_t w5 = util::SafeLoadAs<uint64_t>(in);
0949   w5 = arrow::bit_util::FromLittleEndian(w5);
0950   in += 8;
0951   uint64_t w6 = util::SafeLoadAs<uint64_t>(in);
0952   w6 = arrow::bit_util::FromLittleEndian(w6);
0953   in += 8;
0954   uint64_t w7 = util::SafeLoadAs<uint64_t>(in);
0955   w7 = arrow::bit_util::FromLittleEndian(w7);
0956   in += 8;
0957   uint64_t w8 = util::SafeLoadAs<uint64_t>(in);
0958   w8 = arrow::bit_util::FromLittleEndian(w8);
0959   in += 8;
0960   out[0] = (w0)&mask;
0961   out[1] = (w0 >> 18) & mask;
0962   out[2] = (w0 >> 36) & mask;
0963   out[3] = ((w0 >> 54) | (w1 << 10)) & mask;
0964   out[4] = (w1 >> 8) & mask;
0965   out[5] = (w1 >> 26) & mask;
0966   out[6] = (w1 >> 44) & mask;
0967   out[7] = ((w1 >> 62) | (w2 << 2)) & mask;
0968   out[8] = (w2 >> 16) & mask;
0969   out[9] = (w2 >> 34) & mask;
0970   out[10] = ((w2 >> 52) | (w3 << 12)) & mask;
0971   out[11] = (w3 >> 6) & mask;
0972   out[12] = (w3 >> 24) & mask;
0973   out[13] = (w3 >> 42) & mask;
0974   out[14] = ((w3 >> 60) | (w4 << 4)) & mask;
0975   out[15] = (w4 >> 14) & mask;
0976   out[16] = (w4 >> 32) & mask;
0977   out[17] = ((w4 >> 50) | (w5 << 14)) & mask;
0978   out[18] = (w5 >> 4) & mask;
0979   out[19] = (w5 >> 22) & mask;
0980   out[20] = (w5 >> 40) & mask;
0981   out[21] = ((w5 >> 58) | (w6 << 6)) & mask;
0982   out[22] = (w6 >> 12) & mask;
0983   out[23] = (w6 >> 30) & mask;
0984   out[24] = ((w6 >> 48) | (w7 << 16)) & mask;
0985   out[25] = (w7 >> 2) & mask;
0986   out[26] = (w7 >> 20) & mask;
0987   out[27] = (w7 >> 38) & mask;
0988   out[28] = ((w7 >> 56) | (w8 << 8)) & mask;
0989   out[29] = (w8 >> 10) & mask;
0990   out[30] = (w8 >> 28) & mask;
0991   out[31] = w8 >> 46;
0992 
0993   return in;
0994 }
0995 
0996 inline const uint8_t* unpack19_64(const uint8_t* in, uint64_t* out) {
0997   const uint64_t mask = 524287ULL;
0998   uint64_t w0 = util::SafeLoadAs<uint64_t>(in);
0999   w0 = arrow::bit_util::FromLittleEndian(w0);
1000   in += 8;
1001   uint64_t w1 = util::SafeLoadAs<uint64_t>(in);
1002   w1 = arrow::bit_util::FromLittleEndian(w1);
1003   in += 8;
1004   uint64_t w2 = util::SafeLoadAs<uint64_t>(in);
1005   w2 = arrow::bit_util::FromLittleEndian(w2);
1006   in += 8;
1007   uint64_t w3 = util::SafeLoadAs<uint64_t>(in);
1008   w3 = arrow::bit_util::FromLittleEndian(w3);
1009   in += 8;
1010   uint64_t w4 = util::SafeLoadAs<uint64_t>(in);
1011   w4 = arrow::bit_util::FromLittleEndian(w4);
1012   in += 8;
1013   uint64_t w5 = util::SafeLoadAs<uint64_t>(in);
1014   w5 = arrow::bit_util::FromLittleEndian(w5);
1015   in += 8;
1016   uint64_t w6 = util::SafeLoadAs<uint64_t>(in);
1017   w6 = arrow::bit_util::FromLittleEndian(w6);
1018   in += 8;
1019   uint64_t w7 = util::SafeLoadAs<uint64_t>(in);
1020   w7 = arrow::bit_util::FromLittleEndian(w7);
1021   in += 8;
1022   uint64_t w8 = util::SafeLoadAs<uint64_t>(in);
1023   w8 = arrow::bit_util::FromLittleEndian(w8);
1024   in += 8;
1025   uint64_t w9 = util::SafeLoadAs<uint32_t>(in);
1026   w9 = arrow::bit_util::FromLittleEndian(w9);
1027   in += 4;
1028   out[0] = (w0)&mask;
1029   out[1] = (w0 >> 19) & mask;
1030   out[2] = (w0 >> 38) & mask;
1031   out[3] = ((w0 >> 57) | (w1 << 7)) & mask;
1032   out[4] = (w1 >> 12) & mask;
1033   out[5] = (w1 >> 31) & mask;
1034   out[6] = ((w1 >> 50) | (w2 << 14)) & mask;
1035   out[7] = (w2 >> 5) & mask;
1036   out[8] = (w2 >> 24) & mask;
1037   out[9] = (w2 >> 43) & mask;
1038   out[10] = ((w2 >> 62) | (w3 << 2)) & mask;
1039   out[11] = (w3 >> 17) & mask;
1040   out[12] = (w3 >> 36) & mask;
1041   out[13] = ((w3 >> 55) | (w4 << 9)) & mask;
1042   out[14] = (w4 >> 10) & mask;
1043   out[15] = (w4 >> 29) & mask;
1044   out[16] = ((w4 >> 48) | (w5 << 16)) & mask;
1045   out[17] = (w5 >> 3) & mask;
1046   out[18] = (w5 >> 22) & mask;
1047   out[19] = (w5 >> 41) & mask;
1048   out[20] = ((w5 >> 60) | (w6 << 4)) & mask;
1049   out[21] = (w6 >> 15) & mask;
1050   out[22] = (w6 >> 34) & mask;
1051   out[23] = ((w6 >> 53) | (w7 << 11)) & mask;
1052   out[24] = (w7 >> 8) & mask;
1053   out[25] = (w7 >> 27) & mask;
1054   out[26] = ((w7 >> 46) | (w8 << 18)) & mask;
1055   out[27] = (w8 >> 1) & mask;
1056   out[28] = (w8 >> 20) & mask;
1057   out[29] = (w8 >> 39) & mask;
1058   out[30] = ((w8 >> 58) | (w9 << 6)) & mask;
1059   out[31] = (w9 >> 13) & mask;
1060 
1061   return in;
1062 }
1063 
1064 inline const uint8_t* unpack20_64(const uint8_t* in, uint64_t* out) {
1065   const uint64_t mask = 1048575ULL;
1066   uint64_t w0 = util::SafeLoadAs<uint64_t>(in);
1067   w0 = arrow::bit_util::FromLittleEndian(w0);
1068   in += 8;
1069   uint64_t w1 = util::SafeLoadAs<uint64_t>(in);
1070   w1 = arrow::bit_util::FromLittleEndian(w1);
1071   in += 8;
1072   uint64_t w2 = util::SafeLoadAs<uint64_t>(in);
1073   w2 = arrow::bit_util::FromLittleEndian(w2);
1074   in += 8;
1075   uint64_t w3 = util::SafeLoadAs<uint64_t>(in);
1076   w3 = arrow::bit_util::FromLittleEndian(w3);
1077   in += 8;
1078   uint64_t w4 = util::SafeLoadAs<uint64_t>(in);
1079   w4 = arrow::bit_util::FromLittleEndian(w4);
1080   in += 8;
1081   uint64_t w5 = util::SafeLoadAs<uint64_t>(in);
1082   w5 = arrow::bit_util::FromLittleEndian(w5);
1083   in += 8;
1084   uint64_t w6 = util::SafeLoadAs<uint64_t>(in);
1085   w6 = arrow::bit_util::FromLittleEndian(w6);
1086   in += 8;
1087   uint64_t w7 = util::SafeLoadAs<uint64_t>(in);
1088   w7 = arrow::bit_util::FromLittleEndian(w7);
1089   in += 8;
1090   uint64_t w8 = util::SafeLoadAs<uint64_t>(in);
1091   w8 = arrow::bit_util::FromLittleEndian(w8);
1092   in += 8;
1093   uint64_t w9 = util::SafeLoadAs<uint64_t>(in);
1094   w9 = arrow::bit_util::FromLittleEndian(w9);
1095   in += 8;
1096   out[0] = (w0)&mask;
1097   out[1] = (w0 >> 20) & mask;
1098   out[2] = (w0 >> 40) & mask;
1099   out[3] = ((w0 >> 60) | (w1 << 4)) & mask;
1100   out[4] = (w1 >> 16) & mask;
1101   out[5] = (w1 >> 36) & mask;
1102   out[6] = ((w1 >> 56) | (w2 << 8)) & mask;
1103   out[7] = (w2 >> 12) & mask;
1104   out[8] = (w2 >> 32) & mask;
1105   out[9] = ((w2 >> 52) | (w3 << 12)) & mask;
1106   out[10] = (w3 >> 8) & mask;
1107   out[11] = (w3 >> 28) & mask;
1108   out[12] = ((w3 >> 48) | (w4 << 16)) & mask;
1109   out[13] = (w4 >> 4) & mask;
1110   out[14] = (w4 >> 24) & mask;
1111   out[15] = w4 >> 44;
1112   out[16] = (w5)&mask;
1113   out[17] = (w5 >> 20) & mask;
1114   out[18] = (w5 >> 40) & mask;
1115   out[19] = ((w5 >> 60) | (w6 << 4)) & mask;
1116   out[20] = (w6 >> 16) & mask;
1117   out[21] = (w6 >> 36) & mask;
1118   out[22] = ((w6 >> 56) | (w7 << 8)) & mask;
1119   out[23] = (w7 >> 12) & mask;
1120   out[24] = (w7 >> 32) & mask;
1121   out[25] = ((w7 >> 52) | (w8 << 12)) & mask;
1122   out[26] = (w8 >> 8) & mask;
1123   out[27] = (w8 >> 28) & mask;
1124   out[28] = ((w8 >> 48) | (w9 << 16)) & mask;
1125   out[29] = (w9 >> 4) & mask;
1126   out[30] = (w9 >> 24) & mask;
1127   out[31] = w9 >> 44;
1128 
1129   return in;
1130 }
1131 
1132 inline const uint8_t* unpack21_64(const uint8_t* in, uint64_t* out) {
1133   const uint64_t mask = 2097151ULL;
1134   uint64_t w0 = util::SafeLoadAs<uint64_t>(in);
1135   w0 = arrow::bit_util::FromLittleEndian(w0);
1136   in += 8;
1137   uint64_t w1 = util::SafeLoadAs<uint64_t>(in);
1138   w1 = arrow::bit_util::FromLittleEndian(w1);
1139   in += 8;
1140   uint64_t w2 = util::SafeLoadAs<uint64_t>(in);
1141   w2 = arrow::bit_util::FromLittleEndian(w2);
1142   in += 8;
1143   uint64_t w3 = util::SafeLoadAs<uint64_t>(in);
1144   w3 = arrow::bit_util::FromLittleEndian(w3);
1145   in += 8;
1146   uint64_t w4 = util::SafeLoadAs<uint64_t>(in);
1147   w4 = arrow::bit_util::FromLittleEndian(w4);
1148   in += 8;
1149   uint64_t w5 = util::SafeLoadAs<uint64_t>(in);
1150   w5 = arrow::bit_util::FromLittleEndian(w5);
1151   in += 8;
1152   uint64_t w6 = util::SafeLoadAs<uint64_t>(in);
1153   w6 = arrow::bit_util::FromLittleEndian(w6);
1154   in += 8;
1155   uint64_t w7 = util::SafeLoadAs<uint64_t>(in);
1156   w7 = arrow::bit_util::FromLittleEndian(w7);
1157   in += 8;
1158   uint64_t w8 = util::SafeLoadAs<uint64_t>(in);
1159   w8 = arrow::bit_util::FromLittleEndian(w8);
1160   in += 8;
1161   uint64_t w9 = util::SafeLoadAs<uint64_t>(in);
1162   w9 = arrow::bit_util::FromLittleEndian(w9);
1163   in += 8;
1164   uint64_t w10 = util::SafeLoadAs<uint32_t>(in);
1165   w10 = arrow::bit_util::FromLittleEndian(w10);
1166   in += 4;
1167   out[0] = (w0)&mask;
1168   out[1] = (w0 >> 21) & mask;
1169   out[2] = (w0 >> 42) & mask;
1170   out[3] = ((w0 >> 63) | (w1 << 1)) & mask;
1171   out[4] = (w1 >> 20) & mask;
1172   out[5] = (w1 >> 41) & mask;
1173   out[6] = ((w1 >> 62) | (w2 << 2)) & mask;
1174   out[7] = (w2 >> 19) & mask;
1175   out[8] = (w2 >> 40) & mask;
1176   out[9] = ((w2 >> 61) | (w3 << 3)) & mask;
1177   out[10] = (w3 >> 18) & mask;
1178   out[11] = (w3 >> 39) & mask;
1179   out[12] = ((w3 >> 60) | (w4 << 4)) & mask;
1180   out[13] = (w4 >> 17) & mask;
1181   out[14] = (w4 >> 38) & mask;
1182   out[15] = ((w4 >> 59) | (w5 << 5)) & mask;
1183   out[16] = (w5 >> 16) & mask;
1184   out[17] = (w5 >> 37) & mask;
1185   out[18] = ((w5 >> 58) | (w6 << 6)) & mask;
1186   out[19] = (w6 >> 15) & mask;
1187   out[20] = (w6 >> 36) & mask;
1188   out[21] = ((w6 >> 57) | (w7 << 7)) & mask;
1189   out[22] = (w7 >> 14) & mask;
1190   out[23] = (w7 >> 35) & mask;
1191   out[24] = ((w7 >> 56) | (w8 << 8)) & mask;
1192   out[25] = (w8 >> 13) & mask;
1193   out[26] = (w8 >> 34) & mask;
1194   out[27] = ((w8 >> 55) | (w9 << 9)) & mask;
1195   out[28] = (w9 >> 12) & mask;
1196   out[29] = (w9 >> 33) & mask;
1197   out[30] = ((w9 >> 54) | (w10 << 10)) & mask;
1198   out[31] = (w10 >> 11) & mask;
1199 
1200   return in;
1201 }
1202 
1203 inline const uint8_t* unpack22_64(const uint8_t* in, uint64_t* out) {
1204   const uint64_t mask = 4194303ULL;
1205   uint64_t w0 = util::SafeLoadAs<uint64_t>(in);
1206   w0 = arrow::bit_util::FromLittleEndian(w0);
1207   in += 8;
1208   uint64_t w1 = util::SafeLoadAs<uint64_t>(in);
1209   w1 = arrow::bit_util::FromLittleEndian(w1);
1210   in += 8;
1211   uint64_t w2 = util::SafeLoadAs<uint64_t>(in);
1212   w2 = arrow::bit_util::FromLittleEndian(w2);
1213   in += 8;
1214   uint64_t w3 = util::SafeLoadAs<uint64_t>(in);
1215   w3 = arrow::bit_util::FromLittleEndian(w3);
1216   in += 8;
1217   uint64_t w4 = util::SafeLoadAs<uint64_t>(in);
1218   w4 = arrow::bit_util::FromLittleEndian(w4);
1219   in += 8;
1220   uint64_t w5 = util::SafeLoadAs<uint64_t>(in);
1221   w5 = arrow::bit_util::FromLittleEndian(w5);
1222   in += 8;
1223   uint64_t w6 = util::SafeLoadAs<uint64_t>(in);
1224   w6 = arrow::bit_util::FromLittleEndian(w6);
1225   in += 8;
1226   uint64_t w7 = util::SafeLoadAs<uint64_t>(in);
1227   w7 = arrow::bit_util::FromLittleEndian(w7);
1228   in += 8;
1229   uint64_t w8 = util::SafeLoadAs<uint64_t>(in);
1230   w8 = arrow::bit_util::FromLittleEndian(w8);
1231   in += 8;
1232   uint64_t w9 = util::SafeLoadAs<uint64_t>(in);
1233   w9 = arrow::bit_util::FromLittleEndian(w9);
1234   in += 8;
1235   uint64_t w10 = util::SafeLoadAs<uint64_t>(in);
1236   w10 = arrow::bit_util::FromLittleEndian(w10);
1237   in += 8;
1238   out[0] = (w0)&mask;
1239   out[1] = (w0 >> 22) & mask;
1240   out[2] = ((w0 >> 44) | (w1 << 20)) & mask;
1241   out[3] = (w1 >> 2) & mask;
1242   out[4] = (w1 >> 24) & mask;
1243   out[5] = ((w1 >> 46) | (w2 << 18)) & mask;
1244   out[6] = (w2 >> 4) & mask;
1245   out[7] = (w2 >> 26) & mask;
1246   out[8] = ((w2 >> 48) | (w3 << 16)) & mask;
1247   out[9] = (w3 >> 6) & mask;
1248   out[10] = (w3 >> 28) & mask;
1249   out[11] = ((w3 >> 50) | (w4 << 14)) & mask;
1250   out[12] = (w4 >> 8) & mask;
1251   out[13] = (w4 >> 30) & mask;
1252   out[14] = ((w4 >> 52) | (w5 << 12)) & mask;
1253   out[15] = (w5 >> 10) & mask;
1254   out[16] = (w5 >> 32) & mask;
1255   out[17] = ((w5 >> 54) | (w6 << 10)) & mask;
1256   out[18] = (w6 >> 12) & mask;
1257   out[19] = (w6 >> 34) & mask;
1258   out[20] = ((w6 >> 56) | (w7 << 8)) & mask;
1259   out[21] = (w7 >> 14) & mask;
1260   out[22] = (w7 >> 36) & mask;
1261   out[23] = ((w7 >> 58) | (w8 << 6)) & mask;
1262   out[24] = (w8 >> 16) & mask;
1263   out[25] = (w8 >> 38) & mask;
1264   out[26] = ((w8 >> 60) | (w9 << 4)) & mask;
1265   out[27] = (w9 >> 18) & mask;
1266   out[28] = (w9 >> 40) & mask;
1267   out[29] = ((w9 >> 62) | (w10 << 2)) & mask;
1268   out[30] = (w10 >> 20) & mask;
1269   out[31] = w10 >> 42;
1270 
1271   return in;
1272 }
1273 
1274 inline const uint8_t* unpack23_64(const uint8_t* in, uint64_t* out) {
1275   const uint64_t mask = 8388607ULL;
1276   uint64_t w0 = util::SafeLoadAs<uint64_t>(in);
1277   w0 = arrow::bit_util::FromLittleEndian(w0);
1278   in += 8;
1279   uint64_t w1 = util::SafeLoadAs<uint64_t>(in);
1280   w1 = arrow::bit_util::FromLittleEndian(w1);
1281   in += 8;
1282   uint64_t w2 = util::SafeLoadAs<uint64_t>(in);
1283   w2 = arrow::bit_util::FromLittleEndian(w2);
1284   in += 8;
1285   uint64_t w3 = util::SafeLoadAs<uint64_t>(in);
1286   w3 = arrow::bit_util::FromLittleEndian(w3);
1287   in += 8;
1288   uint64_t w4 = util::SafeLoadAs<uint64_t>(in);
1289   w4 = arrow::bit_util::FromLittleEndian(w4);
1290   in += 8;
1291   uint64_t w5 = util::SafeLoadAs<uint64_t>(in);
1292   w5 = arrow::bit_util::FromLittleEndian(w5);
1293   in += 8;
1294   uint64_t w6 = util::SafeLoadAs<uint64_t>(in);
1295   w6 = arrow::bit_util::FromLittleEndian(w6);
1296   in += 8;
1297   uint64_t w7 = util::SafeLoadAs<uint64_t>(in);
1298   w7 = arrow::bit_util::FromLittleEndian(w7);
1299   in += 8;
1300   uint64_t w8 = util::SafeLoadAs<uint64_t>(in);
1301   w8 = arrow::bit_util::FromLittleEndian(w8);
1302   in += 8;
1303   uint64_t w9 = util::SafeLoadAs<uint64_t>(in);
1304   w9 = arrow::bit_util::FromLittleEndian(w9);
1305   in += 8;
1306   uint64_t w10 = util::SafeLoadAs<uint64_t>(in);
1307   w10 = arrow::bit_util::FromLittleEndian(w10);
1308   in += 8;
1309   uint64_t w11 = util::SafeLoadAs<uint32_t>(in);
1310   w11 = arrow::bit_util::FromLittleEndian(w11);
1311   in += 4;
1312   out[0] = (w0)&mask;
1313   out[1] = (w0 >> 23) & mask;
1314   out[2] = ((w0 >> 46) | (w1 << 18)) & mask;
1315   out[3] = (w1 >> 5) & mask;
1316   out[4] = (w1 >> 28) & mask;
1317   out[5] = ((w1 >> 51) | (w2 << 13)) & mask;
1318   out[6] = (w2 >> 10) & mask;
1319   out[7] = (w2 >> 33) & mask;
1320   out[8] = ((w2 >> 56) | (w3 << 8)) & mask;
1321   out[9] = (w3 >> 15) & mask;
1322   out[10] = (w3 >> 38) & mask;
1323   out[11] = ((w3 >> 61) | (w4 << 3)) & mask;
1324   out[12] = (w4 >> 20) & mask;
1325   out[13] = ((w4 >> 43) | (w5 << 21)) & mask;
1326   out[14] = (w5 >> 2) & mask;
1327   out[15] = (w5 >> 25) & mask;
1328   out[16] = ((w5 >> 48) | (w6 << 16)) & mask;
1329   out[17] = (w6 >> 7) & mask;
1330   out[18] = (w6 >> 30) & mask;
1331   out[19] = ((w6 >> 53) | (w7 << 11)) & mask;
1332   out[20] = (w7 >> 12) & mask;
1333   out[21] = (w7 >> 35) & mask;
1334   out[22] = ((w7 >> 58) | (w8 << 6)) & mask;
1335   out[23] = (w8 >> 17) & mask;
1336   out[24] = (w8 >> 40) & mask;
1337   out[25] = ((w8 >> 63) | (w9 << 1)) & mask;
1338   out[26] = (w9 >> 22) & mask;
1339   out[27] = ((w9 >> 45) | (w10 << 19)) & mask;
1340   out[28] = (w10 >> 4) & mask;
1341   out[29] = (w10 >> 27) & mask;
1342   out[30] = ((w10 >> 50) | (w11 << 14)) & mask;
1343   out[31] = (w11 >> 9) & mask;
1344 
1345   return in;
1346 }
1347 
1348 inline const uint8_t* unpack24_64(const uint8_t* in, uint64_t* out) {
1349   const uint64_t mask = 16777215ULL;
1350   uint64_t w0 = util::SafeLoadAs<uint64_t>(in);
1351   w0 = arrow::bit_util::FromLittleEndian(w0);
1352   in += 8;
1353   uint64_t w1 = util::SafeLoadAs<uint64_t>(in);
1354   w1 = arrow::bit_util::FromLittleEndian(w1);
1355   in += 8;
1356   uint64_t w2 = util::SafeLoadAs<uint64_t>(in);
1357   w2 = arrow::bit_util::FromLittleEndian(w2);
1358   in += 8;
1359   uint64_t w3 = util::SafeLoadAs<uint64_t>(in);
1360   w3 = arrow::bit_util::FromLittleEndian(w3);
1361   in += 8;
1362   uint64_t w4 = util::SafeLoadAs<uint64_t>(in);
1363   w4 = arrow::bit_util::FromLittleEndian(w4);
1364   in += 8;
1365   uint64_t w5 = util::SafeLoadAs<uint64_t>(in);
1366   w5 = arrow::bit_util::FromLittleEndian(w5);
1367   in += 8;
1368   uint64_t w6 = util::SafeLoadAs<uint64_t>(in);
1369   w6 = arrow::bit_util::FromLittleEndian(w6);
1370   in += 8;
1371   uint64_t w7 = util::SafeLoadAs<uint64_t>(in);
1372   w7 = arrow::bit_util::FromLittleEndian(w7);
1373   in += 8;
1374   uint64_t w8 = util::SafeLoadAs<uint64_t>(in);
1375   w8 = arrow::bit_util::FromLittleEndian(w8);
1376   in += 8;
1377   uint64_t w9 = util::SafeLoadAs<uint64_t>(in);
1378   w9 = arrow::bit_util::FromLittleEndian(w9);
1379   in += 8;
1380   uint64_t w10 = util::SafeLoadAs<uint64_t>(in);
1381   w10 = arrow::bit_util::FromLittleEndian(w10);
1382   in += 8;
1383   uint64_t w11 = util::SafeLoadAs<uint64_t>(in);
1384   w11 = arrow::bit_util::FromLittleEndian(w11);
1385   in += 8;
1386   out[0] = (w0)&mask;
1387   out[1] = (w0 >> 24) & mask;
1388   out[2] = ((w0 >> 48) | (w1 << 16)) & mask;
1389   out[3] = (w1 >> 8) & mask;
1390   out[4] = (w1 >> 32) & mask;
1391   out[5] = ((w1 >> 56) | (w2 << 8)) & mask;
1392   out[6] = (w2 >> 16) & mask;
1393   out[7] = w2 >> 40;
1394   out[8] = (w3)&mask;
1395   out[9] = (w3 >> 24) & mask;
1396   out[10] = ((w3 >> 48) | (w4 << 16)) & mask;
1397   out[11] = (w4 >> 8) & mask;
1398   out[12] = (w4 >> 32) & mask;
1399   out[13] = ((w4 >> 56) | (w5 << 8)) & mask;
1400   out[14] = (w5 >> 16) & mask;
1401   out[15] = w5 >> 40;
1402   out[16] = (w6)&mask;
1403   out[17] = (w6 >> 24) & mask;
1404   out[18] = ((w6 >> 48) | (w7 << 16)) & mask;
1405   out[19] = (w7 >> 8) & mask;
1406   out[20] = (w7 >> 32) & mask;
1407   out[21] = ((w7 >> 56) | (w8 << 8)) & mask;
1408   out[22] = (w8 >> 16) & mask;
1409   out[23] = w8 >> 40;
1410   out[24] = (w9)&mask;
1411   out[25] = (w9 >> 24) & mask;
1412   out[26] = ((w9 >> 48) | (w10 << 16)) & mask;
1413   out[27] = (w10 >> 8) & mask;
1414   out[28] = (w10 >> 32) & mask;
1415   out[29] = ((w10 >> 56) | (w11 << 8)) & mask;
1416   out[30] = (w11 >> 16) & mask;
1417   out[31] = w11 >> 40;
1418 
1419   return in;
1420 }
1421 
1422 inline const uint8_t* unpack25_64(const uint8_t* in, uint64_t* out) {
1423   const uint64_t mask = 33554431ULL;
1424   uint64_t w0 = util::SafeLoadAs<uint64_t>(in);
1425   w0 = arrow::bit_util::FromLittleEndian(w0);
1426   in += 8;
1427   uint64_t w1 = util::SafeLoadAs<uint64_t>(in);
1428   w1 = arrow::bit_util::FromLittleEndian(w1);
1429   in += 8;
1430   uint64_t w2 = util::SafeLoadAs<uint64_t>(in);
1431   w2 = arrow::bit_util::FromLittleEndian(w2);
1432   in += 8;
1433   uint64_t w3 = util::SafeLoadAs<uint64_t>(in);
1434   w3 = arrow::bit_util::FromLittleEndian(w3);
1435   in += 8;
1436   uint64_t w4 = util::SafeLoadAs<uint64_t>(in);
1437   w4 = arrow::bit_util::FromLittleEndian(w4);
1438   in += 8;
1439   uint64_t w5 = util::SafeLoadAs<uint64_t>(in);
1440   w5 = arrow::bit_util::FromLittleEndian(w5);
1441   in += 8;
1442   uint64_t w6 = util::SafeLoadAs<uint64_t>(in);
1443   w6 = arrow::bit_util::FromLittleEndian(w6);
1444   in += 8;
1445   uint64_t w7 = util::SafeLoadAs<uint64_t>(in);
1446   w7 = arrow::bit_util::FromLittleEndian(w7);
1447   in += 8;
1448   uint64_t w8 = util::SafeLoadAs<uint64_t>(in);
1449   w8 = arrow::bit_util::FromLittleEndian(w8);
1450   in += 8;
1451   uint64_t w9 = util::SafeLoadAs<uint64_t>(in);
1452   w9 = arrow::bit_util::FromLittleEndian(w9);
1453   in += 8;
1454   uint64_t w10 = util::SafeLoadAs<uint64_t>(in);
1455   w10 = arrow::bit_util::FromLittleEndian(w10);
1456   in += 8;
1457   uint64_t w11 = util::SafeLoadAs<uint64_t>(in);
1458   w11 = arrow::bit_util::FromLittleEndian(w11);
1459   in += 8;
1460   uint64_t w12 = util::SafeLoadAs<uint32_t>(in);
1461   w12 = arrow::bit_util::FromLittleEndian(w12);
1462   in += 4;
1463   out[0] = (w0)&mask;
1464   out[1] = (w0 >> 25) & mask;
1465   out[2] = ((w0 >> 50) | (w1 << 14)) & mask;
1466   out[3] = (w1 >> 11) & mask;
1467   out[4] = (w1 >> 36) & mask;
1468   out[5] = ((w1 >> 61) | (w2 << 3)) & mask;
1469   out[6] = (w2 >> 22) & mask;
1470   out[7] = ((w2 >> 47) | (w3 << 17)) & mask;
1471   out[8] = (w3 >> 8) & mask;
1472   out[9] = (w3 >> 33) & mask;
1473   out[10] = ((w3 >> 58) | (w4 << 6)) & mask;
1474   out[11] = (w4 >> 19) & mask;
1475   out[12] = ((w4 >> 44) | (w5 << 20)) & mask;
1476   out[13] = (w5 >> 5) & mask;
1477   out[14] = (w5 >> 30) & mask;
1478   out[15] = ((w5 >> 55) | (w6 << 9)) & mask;
1479   out[16] = (w6 >> 16) & mask;
1480   out[17] = ((w6 >> 41) | (w7 << 23)) & mask;
1481   out[18] = (w7 >> 2) & mask;
1482   out[19] = (w7 >> 27) & mask;
1483   out[20] = ((w7 >> 52) | (w8 << 12)) & mask;
1484   out[21] = (w8 >> 13) & mask;
1485   out[22] = (w8 >> 38) & mask;
1486   out[23] = ((w8 >> 63) | (w9 << 1)) & mask;
1487   out[24] = (w9 >> 24) & mask;
1488   out[25] = ((w9 >> 49) | (w10 << 15)) & mask;
1489   out[26] = (w10 >> 10) & mask;
1490   out[27] = (w10 >> 35) & mask;
1491   out[28] = ((w10 >> 60) | (w11 << 4)) & mask;
1492   out[29] = (w11 >> 21) & mask;
1493   out[30] = ((w11 >> 46) | (w12 << 18)) & mask;
1494   out[31] = (w12 >> 7) & mask;
1495 
1496   return in;
1497 }
1498 
1499 inline const uint8_t* unpack26_64(const uint8_t* in, uint64_t* out) {
1500   const uint64_t mask = 67108863ULL;
1501   uint64_t w0 = util::SafeLoadAs<uint64_t>(in);
1502   w0 = arrow::bit_util::FromLittleEndian(w0);
1503   in += 8;
1504   uint64_t w1 = util::SafeLoadAs<uint64_t>(in);
1505   w1 = arrow::bit_util::FromLittleEndian(w1);
1506   in += 8;
1507   uint64_t w2 = util::SafeLoadAs<uint64_t>(in);
1508   w2 = arrow::bit_util::FromLittleEndian(w2);
1509   in += 8;
1510   uint64_t w3 = util::SafeLoadAs<uint64_t>(in);
1511   w3 = arrow::bit_util::FromLittleEndian(w3);
1512   in += 8;
1513   uint64_t w4 = util::SafeLoadAs<uint64_t>(in);
1514   w4 = arrow::bit_util::FromLittleEndian(w4);
1515   in += 8;
1516   uint64_t w5 = util::SafeLoadAs<uint64_t>(in);
1517   w5 = arrow::bit_util::FromLittleEndian(w5);
1518   in += 8;
1519   uint64_t w6 = util::SafeLoadAs<uint64_t>(in);
1520   w6 = arrow::bit_util::FromLittleEndian(w6);
1521   in += 8;
1522   uint64_t w7 = util::SafeLoadAs<uint64_t>(in);
1523   w7 = arrow::bit_util::FromLittleEndian(w7);
1524   in += 8;
1525   uint64_t w8 = util::SafeLoadAs<uint64_t>(in);
1526   w8 = arrow::bit_util::FromLittleEndian(w8);
1527   in += 8;
1528   uint64_t w9 = util::SafeLoadAs<uint64_t>(in);
1529   w9 = arrow::bit_util::FromLittleEndian(w9);
1530   in += 8;
1531   uint64_t w10 = util::SafeLoadAs<uint64_t>(in);
1532   w10 = arrow::bit_util::FromLittleEndian(w10);
1533   in += 8;
1534   uint64_t w11 = util::SafeLoadAs<uint64_t>(in);
1535   w11 = arrow::bit_util::FromLittleEndian(w11);
1536   in += 8;
1537   uint64_t w12 = util::SafeLoadAs<uint64_t>(in);
1538   w12 = arrow::bit_util::FromLittleEndian(w12);
1539   in += 8;
1540   out[0] = (w0)&mask;
1541   out[1] = (w0 >> 26) & mask;
1542   out[2] = ((w0 >> 52) | (w1 << 12)) & mask;
1543   out[3] = (w1 >> 14) & mask;
1544   out[4] = ((w1 >> 40) | (w2 << 24)) & mask;
1545   out[5] = (w2 >> 2) & mask;
1546   out[6] = (w2 >> 28) & mask;
1547   out[7] = ((w2 >> 54) | (w3 << 10)) & mask;
1548   out[8] = (w3 >> 16) & mask;
1549   out[9] = ((w3 >> 42) | (w4 << 22)) & mask;
1550   out[10] = (w4 >> 4) & mask;
1551   out[11] = (w4 >> 30) & mask;
1552   out[12] = ((w4 >> 56) | (w5 << 8)) & mask;
1553   out[13] = (w5 >> 18) & mask;
1554   out[14] = ((w5 >> 44) | (w6 << 20)) & mask;
1555   out[15] = (w6 >> 6) & mask;
1556   out[16] = (w6 >> 32) & mask;
1557   out[17] = ((w6 >> 58) | (w7 << 6)) & mask;
1558   out[18] = (w7 >> 20) & mask;
1559   out[19] = ((w7 >> 46) | (w8 << 18)) & mask;
1560   out[20] = (w8 >> 8) & mask;
1561   out[21] = (w8 >> 34) & mask;
1562   out[22] = ((w8 >> 60) | (w9 << 4)) & mask;
1563   out[23] = (w9 >> 22) & mask;
1564   out[24] = ((w9 >> 48) | (w10 << 16)) & mask;
1565   out[25] = (w10 >> 10) & mask;
1566   out[26] = (w10 >> 36) & mask;
1567   out[27] = ((w10 >> 62) | (w11 << 2)) & mask;
1568   out[28] = (w11 >> 24) & mask;
1569   out[29] = ((w11 >> 50) | (w12 << 14)) & mask;
1570   out[30] = (w12 >> 12) & mask;
1571   out[31] = w12 >> 38;
1572 
1573   return in;
1574 }
1575 
1576 inline const uint8_t* unpack27_64(const uint8_t* in, uint64_t* out) {
1577   const uint64_t mask = 134217727ULL;
1578   uint64_t w0 = util::SafeLoadAs<uint64_t>(in);
1579   w0 = arrow::bit_util::FromLittleEndian(w0);
1580   in += 8;
1581   uint64_t w1 = util::SafeLoadAs<uint64_t>(in);
1582   w1 = arrow::bit_util::FromLittleEndian(w1);
1583   in += 8;
1584   uint64_t w2 = util::SafeLoadAs<uint64_t>(in);
1585   w2 = arrow::bit_util::FromLittleEndian(w2);
1586   in += 8;
1587   uint64_t w3 = util::SafeLoadAs<uint64_t>(in);
1588   w3 = arrow::bit_util::FromLittleEndian(w3);
1589   in += 8;
1590   uint64_t w4 = util::SafeLoadAs<uint64_t>(in);
1591   w4 = arrow::bit_util::FromLittleEndian(w4);
1592   in += 8;
1593   uint64_t w5 = util::SafeLoadAs<uint64_t>(in);
1594   w5 = arrow::bit_util::FromLittleEndian(w5);
1595   in += 8;
1596   uint64_t w6 = util::SafeLoadAs<uint64_t>(in);
1597   w6 = arrow::bit_util::FromLittleEndian(w6);
1598   in += 8;
1599   uint64_t w7 = util::SafeLoadAs<uint64_t>(in);
1600   w7 = arrow::bit_util::FromLittleEndian(w7);
1601   in += 8;
1602   uint64_t w8 = util::SafeLoadAs<uint64_t>(in);
1603   w8 = arrow::bit_util::FromLittleEndian(w8);
1604   in += 8;
1605   uint64_t w9 = util::SafeLoadAs<uint64_t>(in);
1606   w9 = arrow::bit_util::FromLittleEndian(w9);
1607   in += 8;
1608   uint64_t w10 = util::SafeLoadAs<uint64_t>(in);
1609   w10 = arrow::bit_util::FromLittleEndian(w10);
1610   in += 8;
1611   uint64_t w11 = util::SafeLoadAs<uint64_t>(in);
1612   w11 = arrow::bit_util::FromLittleEndian(w11);
1613   in += 8;
1614   uint64_t w12 = util::SafeLoadAs<uint64_t>(in);
1615   w12 = arrow::bit_util::FromLittleEndian(w12);
1616   in += 8;
1617   uint64_t w13 = util::SafeLoadAs<uint32_t>(in);
1618   w13 = arrow::bit_util::FromLittleEndian(w13);
1619   in += 4;
1620   out[0] = (w0)&mask;
1621   out[1] = (w0 >> 27) & mask;
1622   out[2] = ((w0 >> 54) | (w1 << 10)) & mask;
1623   out[3] = (w1 >> 17) & mask;
1624   out[4] = ((w1 >> 44) | (w2 << 20)) & mask;
1625   out[5] = (w2 >> 7) & mask;
1626   out[6] = (w2 >> 34) & mask;
1627   out[7] = ((w2 >> 61) | (w3 << 3)) & mask;
1628   out[8] = (w3 >> 24) & mask;
1629   out[9] = ((w3 >> 51) | (w4 << 13)) & mask;
1630   out[10] = (w4 >> 14) & mask;
1631   out[11] = ((w4 >> 41) | (w5 << 23)) & mask;
1632   out[12] = (w5 >> 4) & mask;
1633   out[13] = (w5 >> 31) & mask;
1634   out[14] = ((w5 >> 58) | (w6 << 6)) & mask;
1635   out[15] = (w6 >> 21) & mask;
1636   out[16] = ((w6 >> 48) | (w7 << 16)) & mask;
1637   out[17] = (w7 >> 11) & mask;
1638   out[18] = ((w7 >> 38) | (w8 << 26)) & mask;
1639   out[19] = (w8 >> 1) & mask;
1640   out[20] = (w8 >> 28) & mask;
1641   out[21] = ((w8 >> 55) | (w9 << 9)) & mask;
1642   out[22] = (w9 >> 18) & mask;
1643   out[23] = ((w9 >> 45) | (w10 << 19)) & mask;
1644   out[24] = (w10 >> 8) & mask;
1645   out[25] = (w10 >> 35) & mask;
1646   out[26] = ((w10 >> 62) | (w11 << 2)) & mask;
1647   out[27] = (w11 >> 25) & mask;
1648   out[28] = ((w11 >> 52) | (w12 << 12)) & mask;
1649   out[29] = (w12 >> 15) & mask;
1650   out[30] = ((w12 >> 42) | (w13 << 22)) & mask;
1651   out[31] = (w13 >> 5) & mask;
1652 
1653   return in;
1654 }
1655 
1656 inline const uint8_t* unpack28_64(const uint8_t* in, uint64_t* out) {
1657   const uint64_t mask = 268435455ULL;
1658   uint64_t w0 = util::SafeLoadAs<uint64_t>(in);
1659   w0 = arrow::bit_util::FromLittleEndian(w0);
1660   in += 8;
1661   uint64_t w1 = util::SafeLoadAs<uint64_t>(in);
1662   w1 = arrow::bit_util::FromLittleEndian(w1);
1663   in += 8;
1664   uint64_t w2 = util::SafeLoadAs<uint64_t>(in);
1665   w2 = arrow::bit_util::FromLittleEndian(w2);
1666   in += 8;
1667   uint64_t w3 = util::SafeLoadAs<uint64_t>(in);
1668   w3 = arrow::bit_util::FromLittleEndian(w3);
1669   in += 8;
1670   uint64_t w4 = util::SafeLoadAs<uint64_t>(in);
1671   w4 = arrow::bit_util::FromLittleEndian(w4);
1672   in += 8;
1673   uint64_t w5 = util::SafeLoadAs<uint64_t>(in);
1674   w5 = arrow::bit_util::FromLittleEndian(w5);
1675   in += 8;
1676   uint64_t w6 = util::SafeLoadAs<uint64_t>(in);
1677   w6 = arrow::bit_util::FromLittleEndian(w6);
1678   in += 8;
1679   uint64_t w7 = util::SafeLoadAs<uint64_t>(in);
1680   w7 = arrow::bit_util::FromLittleEndian(w7);
1681   in += 8;
1682   uint64_t w8 = util::SafeLoadAs<uint64_t>(in);
1683   w8 = arrow::bit_util::FromLittleEndian(w8);
1684   in += 8;
1685   uint64_t w9 = util::SafeLoadAs<uint64_t>(in);
1686   w9 = arrow::bit_util::FromLittleEndian(w9);
1687   in += 8;
1688   uint64_t w10 = util::SafeLoadAs<uint64_t>(in);
1689   w10 = arrow::bit_util::FromLittleEndian(w10);
1690   in += 8;
1691   uint64_t w11 = util::SafeLoadAs<uint64_t>(in);
1692   w11 = arrow::bit_util::FromLittleEndian(w11);
1693   in += 8;
1694   uint64_t w12 = util::SafeLoadAs<uint64_t>(in);
1695   w12 = arrow::bit_util::FromLittleEndian(w12);
1696   in += 8;
1697   uint64_t w13 = util::SafeLoadAs<uint64_t>(in);
1698   w13 = arrow::bit_util::FromLittleEndian(w13);
1699   in += 8;
1700   out[0] = (w0)&mask;
1701   out[1] = (w0 >> 28) & mask;
1702   out[2] = ((w0 >> 56) | (w1 << 8)) & mask;
1703   out[3] = (w1 >> 20) & mask;
1704   out[4] = ((w1 >> 48) | (w2 << 16)) & mask;
1705   out[5] = (w2 >> 12) & mask;
1706   out[6] = ((w2 >> 40) | (w3 << 24)) & mask;
1707   out[7] = (w3 >> 4) & mask;
1708   out[8] = (w3 >> 32) & mask;
1709   out[9] = ((w3 >> 60) | (w4 << 4)) & mask;
1710   out[10] = (w4 >> 24) & mask;
1711   out[11] = ((w4 >> 52) | (w5 << 12)) & mask;
1712   out[12] = (w5 >> 16) & mask;
1713   out[13] = ((w5 >> 44) | (w6 << 20)) & mask;
1714   out[14] = (w6 >> 8) & mask;
1715   out[15] = w6 >> 36;
1716   out[16] = (w7)&mask;
1717   out[17] = (w7 >> 28) & mask;
1718   out[18] = ((w7 >> 56) | (w8 << 8)) & mask;
1719   out[19] = (w8 >> 20) & mask;
1720   out[20] = ((w8 >> 48) | (w9 << 16)) & mask;
1721   out[21] = (w9 >> 12) & mask;
1722   out[22] = ((w9 >> 40) | (w10 << 24)) & mask;
1723   out[23] = (w10 >> 4) & mask;
1724   out[24] = (w10 >> 32) & mask;
1725   out[25] = ((w10 >> 60) | (w11 << 4)) & mask;
1726   out[26] = (w11 >> 24) & mask;
1727   out[27] = ((w11 >> 52) | (w12 << 12)) & mask;
1728   out[28] = (w12 >> 16) & mask;
1729   out[29] = ((w12 >> 44) | (w13 << 20)) & mask;
1730   out[30] = (w13 >> 8) & mask;
1731   out[31] = w13 >> 36;
1732 
1733   return in;
1734 }
1735 
1736 inline const uint8_t* unpack29_64(const uint8_t* in, uint64_t* out) {
1737   const uint64_t mask = 536870911ULL;
1738   uint64_t w0 = util::SafeLoadAs<uint64_t>(in);
1739   w0 = arrow::bit_util::FromLittleEndian(w0);
1740   in += 8;
1741   uint64_t w1 = util::SafeLoadAs<uint64_t>(in);
1742   w1 = arrow::bit_util::FromLittleEndian(w1);
1743   in += 8;
1744   uint64_t w2 = util::SafeLoadAs<uint64_t>(in);
1745   w2 = arrow::bit_util::FromLittleEndian(w2);
1746   in += 8;
1747   uint64_t w3 = util::SafeLoadAs<uint64_t>(in);
1748   w3 = arrow::bit_util::FromLittleEndian(w3);
1749   in += 8;
1750   uint64_t w4 = util::SafeLoadAs<uint64_t>(in);
1751   w4 = arrow::bit_util::FromLittleEndian(w4);
1752   in += 8;
1753   uint64_t w5 = util::SafeLoadAs<uint64_t>(in);
1754   w5 = arrow::bit_util::FromLittleEndian(w5);
1755   in += 8;
1756   uint64_t w6 = util::SafeLoadAs<uint64_t>(in);
1757   w6 = arrow::bit_util::FromLittleEndian(w6);
1758   in += 8;
1759   uint64_t w7 = util::SafeLoadAs<uint64_t>(in);
1760   w7 = arrow::bit_util::FromLittleEndian(w7);
1761   in += 8;
1762   uint64_t w8 = util::SafeLoadAs<uint64_t>(in);
1763   w8 = arrow::bit_util::FromLittleEndian(w8);
1764   in += 8;
1765   uint64_t w9 = util::SafeLoadAs<uint64_t>(in);
1766   w9 = arrow::bit_util::FromLittleEndian(w9);
1767   in += 8;
1768   uint64_t w10 = util::SafeLoadAs<uint64_t>(in);
1769   w10 = arrow::bit_util::FromLittleEndian(w10);
1770   in += 8;
1771   uint64_t w11 = util::SafeLoadAs<uint64_t>(in);
1772   w11 = arrow::bit_util::FromLittleEndian(w11);
1773   in += 8;
1774   uint64_t w12 = util::SafeLoadAs<uint64_t>(in);
1775   w12 = arrow::bit_util::FromLittleEndian(w12);
1776   in += 8;
1777   uint64_t w13 = util::SafeLoadAs<uint64_t>(in);
1778   w13 = arrow::bit_util::FromLittleEndian(w13);
1779   in += 8;
1780   uint64_t w14 = util::SafeLoadAs<uint32_t>(in);
1781   w14 = arrow::bit_util::FromLittleEndian(w14);
1782   in += 4;
1783   out[0] = (w0)&mask;
1784   out[1] = (w0 >> 29) & mask;
1785   out[2] = ((w0 >> 58) | (w1 << 6)) & mask;
1786   out[3] = (w1 >> 23) & mask;
1787   out[4] = ((w1 >> 52) | (w2 << 12)) & mask;
1788   out[5] = (w2 >> 17) & mask;
1789   out[6] = ((w2 >> 46) | (w3 << 18)) & mask;
1790   out[7] = (w3 >> 11) & mask;
1791   out[8] = ((w3 >> 40) | (w4 << 24)) & mask;
1792   out[9] = (w4 >> 5) & mask;
1793   out[10] = (w4 >> 34) & mask;
1794   out[11] = ((w4 >> 63) | (w5 << 1)) & mask;
1795   out[12] = (w5 >> 28) & mask;
1796   out[13] = ((w5 >> 57) | (w6 << 7)) & mask;
1797   out[14] = (w6 >> 22) & mask;
1798   out[15] = ((w6 >> 51) | (w7 << 13)) & mask;
1799   out[16] = (w7 >> 16) & mask;
1800   out[17] = ((w7 >> 45) | (w8 << 19)) & mask;
1801   out[18] = (w8 >> 10) & mask;
1802   out[19] = ((w8 >> 39) | (w9 << 25)) & mask;
1803   out[20] = (w9 >> 4) & mask;
1804   out[21] = (w9 >> 33) & mask;
1805   out[22] = ((w9 >> 62) | (w10 << 2)) & mask;
1806   out[23] = (w10 >> 27) & mask;
1807   out[24] = ((w10 >> 56) | (w11 << 8)) & mask;
1808   out[25] = (w11 >> 21) & mask;
1809   out[26] = ((w11 >> 50) | (w12 << 14)) & mask;
1810   out[27] = (w12 >> 15) & mask;
1811   out[28] = ((w12 >> 44) | (w13 << 20)) & mask;
1812   out[29] = (w13 >> 9) & mask;
1813   out[30] = ((w13 >> 38) | (w14 << 26)) & mask;
1814   out[31] = (w14 >> 3) & mask;
1815 
1816   return in;
1817 }
1818 
1819 inline const uint8_t* unpack30_64(const uint8_t* in, uint64_t* out) {
1820   const uint64_t mask = 1073741823ULL;
1821   uint64_t w0 = util::SafeLoadAs<uint64_t>(in);
1822   w0 = arrow::bit_util::FromLittleEndian(w0);
1823   in += 8;
1824   uint64_t w1 = util::SafeLoadAs<uint64_t>(in);
1825   w1 = arrow::bit_util::FromLittleEndian(w1);
1826   in += 8;
1827   uint64_t w2 = util::SafeLoadAs<uint64_t>(in);
1828   w2 = arrow::bit_util::FromLittleEndian(w2);
1829   in += 8;
1830   uint64_t w3 = util::SafeLoadAs<uint64_t>(in);
1831   w3 = arrow::bit_util::FromLittleEndian(w3);
1832   in += 8;
1833   uint64_t w4 = util::SafeLoadAs<uint64_t>(in);
1834   w4 = arrow::bit_util::FromLittleEndian(w4);
1835   in += 8;
1836   uint64_t w5 = util::SafeLoadAs<uint64_t>(in);
1837   w5 = arrow::bit_util::FromLittleEndian(w5);
1838   in += 8;
1839   uint64_t w6 = util::SafeLoadAs<uint64_t>(in);
1840   w6 = arrow::bit_util::FromLittleEndian(w6);
1841   in += 8;
1842   uint64_t w7 = util::SafeLoadAs<uint64_t>(in);
1843   w7 = arrow::bit_util::FromLittleEndian(w7);
1844   in += 8;
1845   uint64_t w8 = util::SafeLoadAs<uint64_t>(in);
1846   w8 = arrow::bit_util::FromLittleEndian(w8);
1847   in += 8;
1848   uint64_t w9 = util::SafeLoadAs<uint64_t>(in);
1849   w9 = arrow::bit_util::FromLittleEndian(w9);
1850   in += 8;
1851   uint64_t w10 = util::SafeLoadAs<uint64_t>(in);
1852   w10 = arrow::bit_util::FromLittleEndian(w10);
1853   in += 8;
1854   uint64_t w11 = util::SafeLoadAs<uint64_t>(in);
1855   w11 = arrow::bit_util::FromLittleEndian(w11);
1856   in += 8;
1857   uint64_t w12 = util::SafeLoadAs<uint64_t>(in);
1858   w12 = arrow::bit_util::FromLittleEndian(w12);
1859   in += 8;
1860   uint64_t w13 = util::SafeLoadAs<uint64_t>(in);
1861   w13 = arrow::bit_util::FromLittleEndian(w13);
1862   in += 8;
1863   uint64_t w14 = util::SafeLoadAs<uint64_t>(in);
1864   w14 = arrow::bit_util::FromLittleEndian(w14);
1865   in += 8;
1866   out[0] = (w0)&mask;
1867   out[1] = (w0 >> 30) & mask;
1868   out[2] = ((w0 >> 60) | (w1 << 4)) & mask;
1869   out[3] = (w1 >> 26) & mask;
1870   out[4] = ((w1 >> 56) | (w2 << 8)) & mask;
1871   out[5] = (w2 >> 22) & mask;
1872   out[6] = ((w2 >> 52) | (w3 << 12)) & mask;
1873   out[7] = (w3 >> 18) & mask;
1874   out[8] = ((w3 >> 48) | (w4 << 16)) & mask;
1875   out[9] = (w4 >> 14) & mask;
1876   out[10] = ((w4 >> 44) | (w5 << 20)) & mask;
1877   out[11] = (w5 >> 10) & mask;
1878   out[12] = ((w5 >> 40) | (w6 << 24)) & mask;
1879   out[13] = (w6 >> 6) & mask;
1880   out[14] = ((w6 >> 36) | (w7 << 28)) & mask;
1881   out[15] = (w7 >> 2) & mask;
1882   out[16] = (w7 >> 32) & mask;
1883   out[17] = ((w7 >> 62) | (w8 << 2)) & mask;
1884   out[18] = (w8 >> 28) & mask;
1885   out[19] = ((w8 >> 58) | (w9 << 6)) & mask;
1886   out[20] = (w9 >> 24) & mask;
1887   out[21] = ((w9 >> 54) | (w10 << 10)) & mask;
1888   out[22] = (w10 >> 20) & mask;
1889   out[23] = ((w10 >> 50) | (w11 << 14)) & mask;
1890   out[24] = (w11 >> 16) & mask;
1891   out[25] = ((w11 >> 46) | (w12 << 18)) & mask;
1892   out[26] = (w12 >> 12) & mask;
1893   out[27] = ((w12 >> 42) | (w13 << 22)) & mask;
1894   out[28] = (w13 >> 8) & mask;
1895   out[29] = ((w13 >> 38) | (w14 << 26)) & mask;
1896   out[30] = (w14 >> 4) & mask;
1897   out[31] = w14 >> 34;
1898 
1899   return in;
1900 }
1901 
1902 inline const uint8_t* unpack31_64(const uint8_t* in, uint64_t* out) {
1903   const uint64_t mask = 2147483647ULL;
1904   uint64_t w0 = util::SafeLoadAs<uint64_t>(in);
1905   w0 = arrow::bit_util::FromLittleEndian(w0);
1906   in += 8;
1907   uint64_t w1 = util::SafeLoadAs<uint64_t>(in);
1908   w1 = arrow::bit_util::FromLittleEndian(w1);
1909   in += 8;
1910   uint64_t w2 = util::SafeLoadAs<uint64_t>(in);
1911   w2 = arrow::bit_util::FromLittleEndian(w2);
1912   in += 8;
1913   uint64_t w3 = util::SafeLoadAs<uint64_t>(in);
1914   w3 = arrow::bit_util::FromLittleEndian(w3);
1915   in += 8;
1916   uint64_t w4 = util::SafeLoadAs<uint64_t>(in);
1917   w4 = arrow::bit_util::FromLittleEndian(w4);
1918   in += 8;
1919   uint64_t w5 = util::SafeLoadAs<uint64_t>(in);
1920   w5 = arrow::bit_util::FromLittleEndian(w5);
1921   in += 8;
1922   uint64_t w6 = util::SafeLoadAs<uint64_t>(in);
1923   w6 = arrow::bit_util::FromLittleEndian(w6);
1924   in += 8;
1925   uint64_t w7 = util::SafeLoadAs<uint64_t>(in);
1926   w7 = arrow::bit_util::FromLittleEndian(w7);
1927   in += 8;
1928   uint64_t w8 = util::SafeLoadAs<uint64_t>(in);
1929   w8 = arrow::bit_util::FromLittleEndian(w8);
1930   in += 8;
1931   uint64_t w9 = util::SafeLoadAs<uint64_t>(in);
1932   w9 = arrow::bit_util::FromLittleEndian(w9);
1933   in += 8;
1934   uint64_t w10 = util::SafeLoadAs<uint64_t>(in);
1935   w10 = arrow::bit_util::FromLittleEndian(w10);
1936   in += 8;
1937   uint64_t w11 = util::SafeLoadAs<uint64_t>(in);
1938   w11 = arrow::bit_util::FromLittleEndian(w11);
1939   in += 8;
1940   uint64_t w12 = util::SafeLoadAs<uint64_t>(in);
1941   w12 = arrow::bit_util::FromLittleEndian(w12);
1942   in += 8;
1943   uint64_t w13 = util::SafeLoadAs<uint64_t>(in);
1944   w13 = arrow::bit_util::FromLittleEndian(w13);
1945   in += 8;
1946   uint64_t w14 = util::SafeLoadAs<uint64_t>(in);
1947   w14 = arrow::bit_util::FromLittleEndian(w14);
1948   in += 8;
1949   uint64_t w15 = util::SafeLoadAs<uint32_t>(in);
1950   w15 = arrow::bit_util::FromLittleEndian(w15);
1951   in += 4;
1952   out[0] = (w0)&mask;
1953   out[1] = (w0 >> 31) & mask;
1954   out[2] = ((w0 >> 62) | (w1 << 2)) & mask;
1955   out[3] = (w1 >> 29) & mask;
1956   out[4] = ((w1 >> 60) | (w2 << 4)) & mask;
1957   out[5] = (w2 >> 27) & mask;
1958   out[6] = ((w2 >> 58) | (w3 << 6)) & mask;
1959   out[7] = (w3 >> 25) & mask;
1960   out[8] = ((w3 >> 56) | (w4 << 8)) & mask;
1961   out[9] = (w4 >> 23) & mask;
1962   out[10] = ((w4 >> 54) | (w5 << 10)) & mask;
1963   out[11] = (w5 >> 21) & mask;
1964   out[12] = ((w5 >> 52) | (w6 << 12)) & mask;
1965   out[13] = (w6 >> 19) & mask;
1966   out[14] = ((w6 >> 50) | (w7 << 14)) & mask;
1967   out[15] = (w7 >> 17) & mask;
1968   out[16] = ((w7 >> 48) | (w8 << 16)) & mask;
1969   out[17] = (w8 >> 15) & mask;
1970   out[18] = ((w8 >> 46) | (w9 << 18)) & mask;
1971   out[19] = (w9 >> 13) & mask;
1972   out[20] = ((w9 >> 44) | (w10 << 20)) & mask;
1973   out[21] = (w10 >> 11) & mask;
1974   out[22] = ((w10 >> 42) | (w11 << 22)) & mask;
1975   out[23] = (w11 >> 9) & mask;
1976   out[24] = ((w11 >> 40) | (w12 << 24)) & mask;
1977   out[25] = (w12 >> 7) & mask;
1978   out[26] = ((w12 >> 38) | (w13 << 26)) & mask;
1979   out[27] = (w13 >> 5) & mask;
1980   out[28] = ((w13 >> 36) | (w14 << 28)) & mask;
1981   out[29] = (w14 >> 3) & mask;
1982   out[30] = ((w14 >> 34) | (w15 << 30)) & mask;
1983   out[31] = (w15 >> 1) & mask;
1984 
1985   return in;
1986 }
1987 
1988 inline const uint8_t* unpack32_64(const uint8_t* in, uint64_t* out) {
1989   const uint64_t mask = 4294967295ULL;
1990   uint64_t w0 = util::SafeLoadAs<uint64_t>(in);
1991   w0 = arrow::bit_util::FromLittleEndian(w0);
1992   in += 8;
1993   uint64_t w1 = util::SafeLoadAs<uint64_t>(in);
1994   w1 = arrow::bit_util::FromLittleEndian(w1);
1995   in += 8;
1996   uint64_t w2 = util::SafeLoadAs<uint64_t>(in);
1997   w2 = arrow::bit_util::FromLittleEndian(w2);
1998   in += 8;
1999   uint64_t w3 = util::SafeLoadAs<uint64_t>(in);
2000   w3 = arrow::bit_util::FromLittleEndian(w3);
2001   in += 8;
2002   uint64_t w4 = util::SafeLoadAs<uint64_t>(in);
2003   w4 = arrow::bit_util::FromLittleEndian(w4);
2004   in += 8;
2005   uint64_t w5 = util::SafeLoadAs<uint64_t>(in);
2006   w5 = arrow::bit_util::FromLittleEndian(w5);
2007   in += 8;
2008   uint64_t w6 = util::SafeLoadAs<uint64_t>(in);
2009   w6 = arrow::bit_util::FromLittleEndian(w6);
2010   in += 8;
2011   uint64_t w7 = util::SafeLoadAs<uint64_t>(in);
2012   w7 = arrow::bit_util::FromLittleEndian(w7);
2013   in += 8;
2014   uint64_t w8 = util::SafeLoadAs<uint64_t>(in);
2015   w8 = arrow::bit_util::FromLittleEndian(w8);
2016   in += 8;
2017   uint64_t w9 = util::SafeLoadAs<uint64_t>(in);
2018   w9 = arrow::bit_util::FromLittleEndian(w9);
2019   in += 8;
2020   uint64_t w10 = util::SafeLoadAs<uint64_t>(in);
2021   w10 = arrow::bit_util::FromLittleEndian(w10);
2022   in += 8;
2023   uint64_t w11 = util::SafeLoadAs<uint64_t>(in);
2024   w11 = arrow::bit_util::FromLittleEndian(w11);
2025   in += 8;
2026   uint64_t w12 = util::SafeLoadAs<uint64_t>(in);
2027   w12 = arrow::bit_util::FromLittleEndian(w12);
2028   in += 8;
2029   uint64_t w13 = util::SafeLoadAs<uint64_t>(in);
2030   w13 = arrow::bit_util::FromLittleEndian(w13);
2031   in += 8;
2032   uint64_t w14 = util::SafeLoadAs<uint64_t>(in);
2033   w14 = arrow::bit_util::FromLittleEndian(w14);
2034   in += 8;
2035   uint64_t w15 = util::SafeLoadAs<uint64_t>(in);
2036   w15 = arrow::bit_util::FromLittleEndian(w15);
2037   in += 8;
2038   out[0] = (w0)&mask;
2039   out[1] = w0 >> 32;
2040   out[2] = (w1)&mask;
2041   out[3] = w1 >> 32;
2042   out[4] = (w2)&mask;
2043   out[5] = w2 >> 32;
2044   out[6] = (w3)&mask;
2045   out[7] = w3 >> 32;
2046   out[8] = (w4)&mask;
2047   out[9] = w4 >> 32;
2048   out[10] = (w5)&mask;
2049   out[11] = w5 >> 32;
2050   out[12] = (w6)&mask;
2051   out[13] = w6 >> 32;
2052   out[14] = (w7)&mask;
2053   out[15] = w7 >> 32;
2054   out[16] = (w8)&mask;
2055   out[17] = w8 >> 32;
2056   out[18] = (w9)&mask;
2057   out[19] = w9 >> 32;
2058   out[20] = (w10)&mask;
2059   out[21] = w10 >> 32;
2060   out[22] = (w11)&mask;
2061   out[23] = w11 >> 32;
2062   out[24] = (w12)&mask;
2063   out[25] = w12 >> 32;
2064   out[26] = (w13)&mask;
2065   out[27] = w13 >> 32;
2066   out[28] = (w14)&mask;
2067   out[29] = w14 >> 32;
2068   out[30] = (w15)&mask;
2069   out[31] = w15 >> 32;
2070 
2071   return in;
2072 }
2073 
2074 inline const uint8_t* unpack33_64(const uint8_t* in, uint64_t* out) {
2075   const uint64_t mask = 8589934591ULL;
2076   uint64_t w0 = util::SafeLoadAs<uint64_t>(in);
2077   w0 = arrow::bit_util::FromLittleEndian(w0);
2078   in += 8;
2079   uint64_t w1 = util::SafeLoadAs<uint64_t>(in);
2080   w1 = arrow::bit_util::FromLittleEndian(w1);
2081   in += 8;
2082   uint64_t w2 = util::SafeLoadAs<uint64_t>(in);
2083   w2 = arrow::bit_util::FromLittleEndian(w2);
2084   in += 8;
2085   uint64_t w3 = util::SafeLoadAs<uint64_t>(in);
2086   w3 = arrow::bit_util::FromLittleEndian(w3);
2087   in += 8;
2088   uint64_t w4 = util::SafeLoadAs<uint64_t>(in);
2089   w4 = arrow::bit_util::FromLittleEndian(w4);
2090   in += 8;
2091   uint64_t w5 = util::SafeLoadAs<uint64_t>(in);
2092   w5 = arrow::bit_util::FromLittleEndian(w5);
2093   in += 8;
2094   uint64_t w6 = util::SafeLoadAs<uint64_t>(in);
2095   w6 = arrow::bit_util::FromLittleEndian(w6);
2096   in += 8;
2097   uint64_t w7 = util::SafeLoadAs<uint64_t>(in);
2098   w7 = arrow::bit_util::FromLittleEndian(w7);
2099   in += 8;
2100   uint64_t w8 = util::SafeLoadAs<uint64_t>(in);
2101   w8 = arrow::bit_util::FromLittleEndian(w8);
2102   in += 8;
2103   uint64_t w9 = util::SafeLoadAs<uint64_t>(in);
2104   w9 = arrow::bit_util::FromLittleEndian(w9);
2105   in += 8;
2106   uint64_t w10 = util::SafeLoadAs<uint64_t>(in);
2107   w10 = arrow::bit_util::FromLittleEndian(w10);
2108   in += 8;
2109   uint64_t w11 = util::SafeLoadAs<uint64_t>(in);
2110   w11 = arrow::bit_util::FromLittleEndian(w11);
2111   in += 8;
2112   uint64_t w12 = util::SafeLoadAs<uint64_t>(in);
2113   w12 = arrow::bit_util::FromLittleEndian(w12);
2114   in += 8;
2115   uint64_t w13 = util::SafeLoadAs<uint64_t>(in);
2116   w13 = arrow::bit_util::FromLittleEndian(w13);
2117   in += 8;
2118   uint64_t w14 = util::SafeLoadAs<uint64_t>(in);
2119   w14 = arrow::bit_util::FromLittleEndian(w14);
2120   in += 8;
2121   uint64_t w15 = util::SafeLoadAs<uint64_t>(in);
2122   w15 = arrow::bit_util::FromLittleEndian(w15);
2123   in += 8;
2124   uint64_t w16 = util::SafeLoadAs<uint32_t>(in);
2125   w16 = arrow::bit_util::FromLittleEndian(w16);
2126   in += 4;
2127   out[0] = (w0)&mask;
2128   out[1] = ((w0 >> 33) | (w1 << 31)) & mask;
2129   out[2] = (w1 >> 2) & mask;
2130   out[3] = ((w1 >> 35) | (w2 << 29)) & mask;
2131   out[4] = (w2 >> 4) & mask;
2132   out[5] = ((w2 >> 37) | (w3 << 27)) & mask;
2133   out[6] = (w3 >> 6) & mask;
2134   out[7] = ((w3 >> 39) | (w4 << 25)) & mask;
2135   out[8] = (w4 >> 8) & mask;
2136   out[9] = ((w4 >> 41) | (w5 << 23)) & mask;
2137   out[10] = (w5 >> 10) & mask;
2138   out[11] = ((w5 >> 43) | (w6 << 21)) & mask;
2139   out[12] = (w6 >> 12) & mask;
2140   out[13] = ((w6 >> 45) | (w7 << 19)) & mask;
2141   out[14] = (w7 >> 14) & mask;
2142   out[15] = ((w7 >> 47) | (w8 << 17)) & mask;
2143   out[16] = (w8 >> 16) & mask;
2144   out[17] = ((w8 >> 49) | (w9 << 15)) & mask;
2145   out[18] = (w9 >> 18) & mask;
2146   out[19] = ((w9 >> 51) | (w10 << 13)) & mask;
2147   out[20] = (w10 >> 20) & mask;
2148   out[21] = ((w10 >> 53) | (w11 << 11)) & mask;
2149   out[22] = (w11 >> 22) & mask;
2150   out[23] = ((w11 >> 55) | (w12 << 9)) & mask;
2151   out[24] = (w12 >> 24) & mask;
2152   out[25] = ((w12 >> 57) | (w13 << 7)) & mask;
2153   out[26] = (w13 >> 26) & mask;
2154   out[27] = ((w13 >> 59) | (w14 << 5)) & mask;
2155   out[28] = (w14 >> 28) & mask;
2156   out[29] = ((w14 >> 61) | (w15 << 3)) & mask;
2157   out[30] = (w15 >> 30) & mask;
2158   out[31] = ((w15 >> 63) | (w16 << 1)) & mask;
2159 
2160   return in;
2161 }
2162 
2163 inline const uint8_t* unpack34_64(const uint8_t* in, uint64_t* out) {
2164   const uint64_t mask = 17179869183ULL;
2165   uint64_t w0 = util::SafeLoadAs<uint64_t>(in);
2166   w0 = arrow::bit_util::FromLittleEndian(w0);
2167   in += 8;
2168   uint64_t w1 = util::SafeLoadAs<uint64_t>(in);
2169   w1 = arrow::bit_util::FromLittleEndian(w1);
2170   in += 8;
2171   uint64_t w2 = util::SafeLoadAs<uint64_t>(in);
2172   w2 = arrow::bit_util::FromLittleEndian(w2);
2173   in += 8;
2174   uint64_t w3 = util::SafeLoadAs<uint64_t>(in);
2175   w3 = arrow::bit_util::FromLittleEndian(w3);
2176   in += 8;
2177   uint64_t w4 = util::SafeLoadAs<uint64_t>(in);
2178   w4 = arrow::bit_util::FromLittleEndian(w4);
2179   in += 8;
2180   uint64_t w5 = util::SafeLoadAs<uint64_t>(in);
2181   w5 = arrow::bit_util::FromLittleEndian(w5);
2182   in += 8;
2183   uint64_t w6 = util::SafeLoadAs<uint64_t>(in);
2184   w6 = arrow::bit_util::FromLittleEndian(w6);
2185   in += 8;
2186   uint64_t w7 = util::SafeLoadAs<uint64_t>(in);
2187   w7 = arrow::bit_util::FromLittleEndian(w7);
2188   in += 8;
2189   uint64_t w8 = util::SafeLoadAs<uint64_t>(in);
2190   w8 = arrow::bit_util::FromLittleEndian(w8);
2191   in += 8;
2192   uint64_t w9 = util::SafeLoadAs<uint64_t>(in);
2193   w9 = arrow::bit_util::FromLittleEndian(w9);
2194   in += 8;
2195   uint64_t w10 = util::SafeLoadAs<uint64_t>(in);
2196   w10 = arrow::bit_util::FromLittleEndian(w10);
2197   in += 8;
2198   uint64_t w11 = util::SafeLoadAs<uint64_t>(in);
2199   w11 = arrow::bit_util::FromLittleEndian(w11);
2200   in += 8;
2201   uint64_t w12 = util::SafeLoadAs<uint64_t>(in);
2202   w12 = arrow::bit_util::FromLittleEndian(w12);
2203   in += 8;
2204   uint64_t w13 = util::SafeLoadAs<uint64_t>(in);
2205   w13 = arrow::bit_util::FromLittleEndian(w13);
2206   in += 8;
2207   uint64_t w14 = util::SafeLoadAs<uint64_t>(in);
2208   w14 = arrow::bit_util::FromLittleEndian(w14);
2209   in += 8;
2210   uint64_t w15 = util::SafeLoadAs<uint64_t>(in);
2211   w15 = arrow::bit_util::FromLittleEndian(w15);
2212   in += 8;
2213   uint64_t w16 = util::SafeLoadAs<uint64_t>(in);
2214   w16 = arrow::bit_util::FromLittleEndian(w16);
2215   in += 8;
2216   out[0] = (w0)&mask;
2217   out[1] = ((w0 >> 34) | (w1 << 30)) & mask;
2218   out[2] = (w1 >> 4) & mask;
2219   out[3] = ((w1 >> 38) | (w2 << 26)) & mask;
2220   out[4] = (w2 >> 8) & mask;
2221   out[5] = ((w2 >> 42) | (w3 << 22)) & mask;
2222   out[6] = (w3 >> 12) & mask;
2223   out[7] = ((w3 >> 46) | (w4 << 18)) & mask;
2224   out[8] = (w4 >> 16) & mask;
2225   out[9] = ((w4 >> 50) | (w5 << 14)) & mask;
2226   out[10] = (w5 >> 20) & mask;
2227   out[11] = ((w5 >> 54) | (w6 << 10)) & mask;
2228   out[12] = (w6 >> 24) & mask;
2229   out[13] = ((w6 >> 58) | (w7 << 6)) & mask;
2230   out[14] = (w7 >> 28) & mask;
2231   out[15] = ((w7 >> 62) | (w8 << 2)) & mask;
2232   out[16] = ((w8 >> 32) | (w9 << 32)) & mask;
2233   out[17] = (w9 >> 2) & mask;
2234   out[18] = ((w9 >> 36) | (w10 << 28)) & mask;
2235   out[19] = (w10 >> 6) & mask;
2236   out[20] = ((w10 >> 40) | (w11 << 24)) & mask;
2237   out[21] = (w11 >> 10) & mask;
2238   out[22] = ((w11 >> 44) | (w12 << 20)) & mask;
2239   out[23] = (w12 >> 14) & mask;
2240   out[24] = ((w12 >> 48) | (w13 << 16)) & mask;
2241   out[25] = (w13 >> 18) & mask;
2242   out[26] = ((w13 >> 52) | (w14 << 12)) & mask;
2243   out[27] = (w14 >> 22) & mask;
2244   out[28] = ((w14 >> 56) | (w15 << 8)) & mask;
2245   out[29] = (w15 >> 26) & mask;
2246   out[30] = ((w15 >> 60) | (w16 << 4)) & mask;
2247   out[31] = w16 >> 30;
2248 
2249   return in;
2250 }
2251 
2252 inline const uint8_t* unpack35_64(const uint8_t* in, uint64_t* out) {
2253   const uint64_t mask = 34359738367ULL;
2254   uint64_t w0 = util::SafeLoadAs<uint64_t>(in);
2255   w0 = arrow::bit_util::FromLittleEndian(w0);
2256   in += 8;
2257   uint64_t w1 = util::SafeLoadAs<uint64_t>(in);
2258   w1 = arrow::bit_util::FromLittleEndian(w1);
2259   in += 8;
2260   uint64_t w2 = util::SafeLoadAs<uint64_t>(in);
2261   w2 = arrow::bit_util::FromLittleEndian(w2);
2262   in += 8;
2263   uint64_t w3 = util::SafeLoadAs<uint64_t>(in);
2264   w3 = arrow::bit_util::FromLittleEndian(w3);
2265   in += 8;
2266   uint64_t w4 = util::SafeLoadAs<uint64_t>(in);
2267   w4 = arrow::bit_util::FromLittleEndian(w4);
2268   in += 8;
2269   uint64_t w5 = util::SafeLoadAs<uint64_t>(in);
2270   w5 = arrow::bit_util::FromLittleEndian(w5);
2271   in += 8;
2272   uint64_t w6 = util::SafeLoadAs<uint64_t>(in);
2273   w6 = arrow::bit_util::FromLittleEndian(w6);
2274   in += 8;
2275   uint64_t w7 = util::SafeLoadAs<uint64_t>(in);
2276   w7 = arrow::bit_util::FromLittleEndian(w7);
2277   in += 8;
2278   uint64_t w8 = util::SafeLoadAs<uint64_t>(in);
2279   w8 = arrow::bit_util::FromLittleEndian(w8);
2280   in += 8;
2281   uint64_t w9 = util::SafeLoadAs<uint64_t>(in);
2282   w9 = arrow::bit_util::FromLittleEndian(w9);
2283   in += 8;
2284   uint64_t w10 = util::SafeLoadAs<uint64_t>(in);
2285   w10 = arrow::bit_util::FromLittleEndian(w10);
2286   in += 8;
2287   uint64_t w11 = util::SafeLoadAs<uint64_t>(in);
2288   w11 = arrow::bit_util::FromLittleEndian(w11);
2289   in += 8;
2290   uint64_t w12 = util::SafeLoadAs<uint64_t>(in);
2291   w12 = arrow::bit_util::FromLittleEndian(w12);
2292   in += 8;
2293   uint64_t w13 = util::SafeLoadAs<uint64_t>(in);
2294   w13 = arrow::bit_util::FromLittleEndian(w13);
2295   in += 8;
2296   uint64_t w14 = util::SafeLoadAs<uint64_t>(in);
2297   w14 = arrow::bit_util::FromLittleEndian(w14);
2298   in += 8;
2299   uint64_t w15 = util::SafeLoadAs<uint64_t>(in);
2300   w15 = arrow::bit_util::FromLittleEndian(w15);
2301   in += 8;
2302   uint64_t w16 = util::SafeLoadAs<uint64_t>(in);
2303   w16 = arrow::bit_util::FromLittleEndian(w16);
2304   in += 8;
2305   uint64_t w17 = util::SafeLoadAs<uint32_t>(in);
2306   w17 = arrow::bit_util::FromLittleEndian(w17);
2307   in += 4;
2308   out[0] = (w0)&mask;
2309   out[1] = ((w0 >> 35) | (w1 << 29)) & mask;
2310   out[2] = (w1 >> 6) & mask;
2311   out[3] = ((w1 >> 41) | (w2 << 23)) & mask;
2312   out[4] = (w2 >> 12) & mask;
2313   out[5] = ((w2 >> 47) | (w3 << 17)) & mask;
2314   out[6] = (w3 >> 18) & mask;
2315   out[7] = ((w3 >> 53) | (w4 << 11)) & mask;
2316   out[8] = (w4 >> 24) & mask;
2317   out[9] = ((w4 >> 59) | (w5 << 5)) & mask;
2318   out[10] = ((w5 >> 30) | (w6 << 34)) & mask;
2319   out[11] = (w6 >> 1) & mask;
2320   out[12] = ((w6 >> 36) | (w7 << 28)) & mask;
2321   out[13] = (w7 >> 7) & mask;
2322   out[14] = ((w7 >> 42) | (w8 << 22)) & mask;
2323   out[15] = (w8 >> 13) & mask;
2324   out[16] = ((w8 >> 48) | (w9 << 16)) & mask;
2325   out[17] = (w9 >> 19) & mask;
2326   out[18] = ((w9 >> 54) | (w10 << 10)) & mask;
2327   out[19] = (w10 >> 25) & mask;
2328   out[20] = ((w10 >> 60) | (w11 << 4)) & mask;
2329   out[21] = ((w11 >> 31) | (w12 << 33)) & mask;
2330   out[22] = (w12 >> 2) & mask;
2331   out[23] = ((w12 >> 37) | (w13 << 27)) & mask;
2332   out[24] = (w13 >> 8) & mask;
2333   out[25] = ((w13 >> 43) | (w14 << 21)) & mask;
2334   out[26] = (w14 >> 14) & mask;
2335   out[27] = ((w14 >> 49) | (w15 << 15)) & mask;
2336   out[28] = (w15 >> 20) & mask;
2337   out[29] = ((w15 >> 55) | (w16 << 9)) & mask;
2338   out[30] = (w16 >> 26) & mask;
2339   out[31] = ((w16 >> 61) | (w17 << 3)) & mask;
2340 
2341   return in;
2342 }
2343 
2344 inline const uint8_t* unpack36_64(const uint8_t* in, uint64_t* out) {
2345   const uint64_t mask = 68719476735ULL;
2346   uint64_t w0 = util::SafeLoadAs<uint64_t>(in);
2347   w0 = arrow::bit_util::FromLittleEndian(w0);
2348   in += 8;
2349   uint64_t w1 = util::SafeLoadAs<uint64_t>(in);
2350   w1 = arrow::bit_util::FromLittleEndian(w1);
2351   in += 8;
2352   uint64_t w2 = util::SafeLoadAs<uint64_t>(in);
2353   w2 = arrow::bit_util::FromLittleEndian(w2);
2354   in += 8;
2355   uint64_t w3 = util::SafeLoadAs<uint64_t>(in);
2356   w3 = arrow::bit_util::FromLittleEndian(w3);
2357   in += 8;
2358   uint64_t w4 = util::SafeLoadAs<uint64_t>(in);
2359   w4 = arrow::bit_util::FromLittleEndian(w4);
2360   in += 8;
2361   uint64_t w5 = util::SafeLoadAs<uint64_t>(in);
2362   w5 = arrow::bit_util::FromLittleEndian(w5);
2363   in += 8;
2364   uint64_t w6 = util::SafeLoadAs<uint64_t>(in);
2365   w6 = arrow::bit_util::FromLittleEndian(w6);
2366   in += 8;
2367   uint64_t w7 = util::SafeLoadAs<uint64_t>(in);
2368   w7 = arrow::bit_util::FromLittleEndian(w7);
2369   in += 8;
2370   uint64_t w8 = util::SafeLoadAs<uint64_t>(in);
2371   w8 = arrow::bit_util::FromLittleEndian(w8);
2372   in += 8;
2373   uint64_t w9 = util::SafeLoadAs<uint64_t>(in);
2374   w9 = arrow::bit_util::FromLittleEndian(w9);
2375   in += 8;
2376   uint64_t w10 = util::SafeLoadAs<uint64_t>(in);
2377   w10 = arrow::bit_util::FromLittleEndian(w10);
2378   in += 8;
2379   uint64_t w11 = util::SafeLoadAs<uint64_t>(in);
2380   w11 = arrow::bit_util::FromLittleEndian(w11);
2381   in += 8;
2382   uint64_t w12 = util::SafeLoadAs<uint64_t>(in);
2383   w12 = arrow::bit_util::FromLittleEndian(w12);
2384   in += 8;
2385   uint64_t w13 = util::SafeLoadAs<uint64_t>(in);
2386   w13 = arrow::bit_util::FromLittleEndian(w13);
2387   in += 8;
2388   uint64_t w14 = util::SafeLoadAs<uint64_t>(in);
2389   w14 = arrow::bit_util::FromLittleEndian(w14);
2390   in += 8;
2391   uint64_t w15 = util::SafeLoadAs<uint64_t>(in);
2392   w15 = arrow::bit_util::FromLittleEndian(w15);
2393   in += 8;
2394   uint64_t w16 = util::SafeLoadAs<uint64_t>(in);
2395   w16 = arrow::bit_util::FromLittleEndian(w16);
2396   in += 8;
2397   uint64_t w17 = util::SafeLoadAs<uint64_t>(in);
2398   w17 = arrow::bit_util::FromLittleEndian(w17);
2399   in += 8;
2400   out[0] = (w0)&mask;
2401   out[1] = ((w0 >> 36) | (w1 << 28)) & mask;
2402   out[2] = (w1 >> 8) & mask;
2403   out[3] = ((w1 >> 44) | (w2 << 20)) & mask;
2404   out[4] = (w2 >> 16) & mask;
2405   out[5] = ((w2 >> 52) | (w3 << 12)) & mask;
2406   out[6] = (w3 >> 24) & mask;
2407   out[7] = ((w3 >> 60) | (w4 << 4)) & mask;
2408   out[8] = ((w4 >> 32) | (w5 << 32)) & mask;
2409   out[9] = (w5 >> 4) & mask;
2410   out[10] = ((w5 >> 40) | (w6 << 24)) & mask;
2411   out[11] = (w6 >> 12) & mask;
2412   out[12] = ((w6 >> 48) | (w7 << 16)) & mask;
2413   out[13] = (w7 >> 20) & mask;
2414   out[14] = ((w7 >> 56) | (w8 << 8)) & mask;
2415   out[15] = w8 >> 28;
2416   out[16] = (w9)&mask;
2417   out[17] = ((w9 >> 36) | (w10 << 28)) & mask;
2418   out[18] = (w10 >> 8) & mask;
2419   out[19] = ((w10 >> 44) | (w11 << 20)) & mask;
2420   out[20] = (w11 >> 16) & mask;
2421   out[21] = ((w11 >> 52) | (w12 << 12)) & mask;
2422   out[22] = (w12 >> 24) & mask;
2423   out[23] = ((w12 >> 60) | (w13 << 4)) & mask;
2424   out[24] = ((w13 >> 32) | (w14 << 32)) & mask;
2425   out[25] = (w14 >> 4) & mask;
2426   out[26] = ((w14 >> 40) | (w15 << 24)) & mask;
2427   out[27] = (w15 >> 12) & mask;
2428   out[28] = ((w15 >> 48) | (w16 << 16)) & mask;
2429   out[29] = (w16 >> 20) & mask;
2430   out[30] = ((w16 >> 56) | (w17 << 8)) & mask;
2431   out[31] = w17 >> 28;
2432 
2433   return in;
2434 }
2435 
2436 inline const uint8_t* unpack37_64(const uint8_t* in, uint64_t* out) {
2437   const uint64_t mask = 137438953471ULL;
2438   uint64_t w0 = util::SafeLoadAs<uint64_t>(in);
2439   w0 = arrow::bit_util::FromLittleEndian(w0);
2440   in += 8;
2441   uint64_t w1 = util::SafeLoadAs<uint64_t>(in);
2442   w1 = arrow::bit_util::FromLittleEndian(w1);
2443   in += 8;
2444   uint64_t w2 = util::SafeLoadAs<uint64_t>(in);
2445   w2 = arrow::bit_util::FromLittleEndian(w2);
2446   in += 8;
2447   uint64_t w3 = util::SafeLoadAs<uint64_t>(in);
2448   w3 = arrow::bit_util::FromLittleEndian(w3);
2449   in += 8;
2450   uint64_t w4 = util::SafeLoadAs<uint64_t>(in);
2451   w4 = arrow::bit_util::FromLittleEndian(w4);
2452   in += 8;
2453   uint64_t w5 = util::SafeLoadAs<uint64_t>(in);
2454   w5 = arrow::bit_util::FromLittleEndian(w5);
2455   in += 8;
2456   uint64_t w6 = util::SafeLoadAs<uint64_t>(in);
2457   w6 = arrow::bit_util::FromLittleEndian(w6);
2458   in += 8;
2459   uint64_t w7 = util::SafeLoadAs<uint64_t>(in);
2460   w7 = arrow::bit_util::FromLittleEndian(w7);
2461   in += 8;
2462   uint64_t w8 = util::SafeLoadAs<uint64_t>(in);
2463   w8 = arrow::bit_util::FromLittleEndian(w8);
2464   in += 8;
2465   uint64_t w9 = util::SafeLoadAs<uint64_t>(in);
2466   w9 = arrow::bit_util::FromLittleEndian(w9);
2467   in += 8;
2468   uint64_t w10 = util::SafeLoadAs<uint64_t>(in);
2469   w10 = arrow::bit_util::FromLittleEndian(w10);
2470   in += 8;
2471   uint64_t w11 = util::SafeLoadAs<uint64_t>(in);
2472   w11 = arrow::bit_util::FromLittleEndian(w11);
2473   in += 8;
2474   uint64_t w12 = util::SafeLoadAs<uint64_t>(in);
2475   w12 = arrow::bit_util::FromLittleEndian(w12);
2476   in += 8;
2477   uint64_t w13 = util::SafeLoadAs<uint64_t>(in);
2478   w13 = arrow::bit_util::FromLittleEndian(w13);
2479   in += 8;
2480   uint64_t w14 = util::SafeLoadAs<uint64_t>(in);
2481   w14 = arrow::bit_util::FromLittleEndian(w14);
2482   in += 8;
2483   uint64_t w15 = util::SafeLoadAs<uint64_t>(in);
2484   w15 = arrow::bit_util::FromLittleEndian(w15);
2485   in += 8;
2486   uint64_t w16 = util::SafeLoadAs<uint64_t>(in);
2487   w16 = arrow::bit_util::FromLittleEndian(w16);
2488   in += 8;
2489   uint64_t w17 = util::SafeLoadAs<uint64_t>(in);
2490   w17 = arrow::bit_util::FromLittleEndian(w17);
2491   in += 8;
2492   uint64_t w18 = util::SafeLoadAs<uint32_t>(in);
2493   w18 = arrow::bit_util::FromLittleEndian(w18);
2494   in += 4;
2495   out[0] = (w0)&mask;
2496   out[1] = ((w0 >> 37) | (w1 << 27)) & mask;
2497   out[2] = (w1 >> 10) & mask;
2498   out[3] = ((w1 >> 47) | (w2 << 17)) & mask;
2499   out[4] = (w2 >> 20) & mask;
2500   out[5] = ((w2 >> 57) | (w3 << 7)) & mask;
2501   out[6] = ((w3 >> 30) | (w4 << 34)) & mask;
2502   out[7] = (w4 >> 3) & mask;
2503   out[8] = ((w4 >> 40) | (w5 << 24)) & mask;
2504   out[9] = (w5 >> 13) & mask;
2505   out[10] = ((w5 >> 50) | (w6 << 14)) & mask;
2506   out[11] = (w6 >> 23) & mask;
2507   out[12] = ((w6 >> 60) | (w7 << 4)) & mask;
2508   out[13] = ((w7 >> 33) | (w8 << 31)) & mask;
2509   out[14] = (w8 >> 6) & mask;
2510   out[15] = ((w8 >> 43) | (w9 << 21)) & mask;
2511   out[16] = (w9 >> 16) & mask;
2512   out[17] = ((w9 >> 53) | (w10 << 11)) & mask;
2513   out[18] = (w10 >> 26) & mask;
2514   out[19] = ((w10 >> 63) | (w11 << 1)) & mask;
2515   out[20] = ((w11 >> 36) | (w12 << 28)) & mask;
2516   out[21] = (w12 >> 9) & mask;
2517   out[22] = ((w12 >> 46) | (w13 << 18)) & mask;
2518   out[23] = (w13 >> 19) & mask;
2519   out[24] = ((w13 >> 56) | (w14 << 8)) & mask;
2520   out[25] = ((w14 >> 29) | (w15 << 35)) & mask;
2521   out[26] = (w15 >> 2) & mask;
2522   out[27] = ((w15 >> 39) | (w16 << 25)) & mask;
2523   out[28] = (w16 >> 12) & mask;
2524   out[29] = ((w16 >> 49) | (w17 << 15)) & mask;
2525   out[30] = (w17 >> 22) & mask;
2526   out[31] = ((w17 >> 59) | (w18 << 5)) & mask;
2527 
2528   return in;
2529 }
2530 
2531 inline const uint8_t* unpack38_64(const uint8_t* in, uint64_t* out) {
2532   const uint64_t mask = 274877906943ULL;
2533   uint64_t w0 = util::SafeLoadAs<uint64_t>(in);
2534   w0 = arrow::bit_util::FromLittleEndian(w0);
2535   in += 8;
2536   uint64_t w1 = util::SafeLoadAs<uint64_t>(in);
2537   w1 = arrow::bit_util::FromLittleEndian(w1);
2538   in += 8;
2539   uint64_t w2 = util::SafeLoadAs<uint64_t>(in);
2540   w2 = arrow::bit_util::FromLittleEndian(w2);
2541   in += 8;
2542   uint64_t w3 = util::SafeLoadAs<uint64_t>(in);
2543   w3 = arrow::bit_util::FromLittleEndian(w3);
2544   in += 8;
2545   uint64_t w4 = util::SafeLoadAs<uint64_t>(in);
2546   w4 = arrow::bit_util::FromLittleEndian(w4);
2547   in += 8;
2548   uint64_t w5 = util::SafeLoadAs<uint64_t>(in);
2549   w5 = arrow::bit_util::FromLittleEndian(w5);
2550   in += 8;
2551   uint64_t w6 = util::SafeLoadAs<uint64_t>(in);
2552   w6 = arrow::bit_util::FromLittleEndian(w6);
2553   in += 8;
2554   uint64_t w7 = util::SafeLoadAs<uint64_t>(in);
2555   w7 = arrow::bit_util::FromLittleEndian(w7);
2556   in += 8;
2557   uint64_t w8 = util::SafeLoadAs<uint64_t>(in);
2558   w8 = arrow::bit_util::FromLittleEndian(w8);
2559   in += 8;
2560   uint64_t w9 = util::SafeLoadAs<uint64_t>(in);
2561   w9 = arrow::bit_util::FromLittleEndian(w9);
2562   in += 8;
2563   uint64_t w10 = util::SafeLoadAs<uint64_t>(in);
2564   w10 = arrow::bit_util::FromLittleEndian(w10);
2565   in += 8;
2566   uint64_t w11 = util::SafeLoadAs<uint64_t>(in);
2567   w11 = arrow::bit_util::FromLittleEndian(w11);
2568   in += 8;
2569   uint64_t w12 = util::SafeLoadAs<uint64_t>(in);
2570   w12 = arrow::bit_util::FromLittleEndian(w12);
2571   in += 8;
2572   uint64_t w13 = util::SafeLoadAs<uint64_t>(in);
2573   w13 = arrow::bit_util::FromLittleEndian(w13);
2574   in += 8;
2575   uint64_t w14 = util::SafeLoadAs<uint64_t>(in);
2576   w14 = arrow::bit_util::FromLittleEndian(w14);
2577   in += 8;
2578   uint64_t w15 = util::SafeLoadAs<uint64_t>(in);
2579   w15 = arrow::bit_util::FromLittleEndian(w15);
2580   in += 8;
2581   uint64_t w16 = util::SafeLoadAs<uint64_t>(in);
2582   w16 = arrow::bit_util::FromLittleEndian(w16);
2583   in += 8;
2584   uint64_t w17 = util::SafeLoadAs<uint64_t>(in);
2585   w17 = arrow::bit_util::FromLittleEndian(w17);
2586   in += 8;
2587   uint64_t w18 = util::SafeLoadAs<uint64_t>(in);
2588   w18 = arrow::bit_util::FromLittleEndian(w18);
2589   in += 8;
2590   out[0] = (w0)&mask;
2591   out[1] = ((w0 >> 38) | (w1 << 26)) & mask;
2592   out[2] = (w1 >> 12) & mask;
2593   out[3] = ((w1 >> 50) | (w2 << 14)) & mask;
2594   out[4] = (w2 >> 24) & mask;
2595   out[5] = ((w2 >> 62) | (w3 << 2)) & mask;
2596   out[6] = ((w3 >> 36) | (w4 << 28)) & mask;
2597   out[7] = (w4 >> 10) & mask;
2598   out[8] = ((w4 >> 48) | (w5 << 16)) & mask;
2599   out[9] = (w5 >> 22) & mask;
2600   out[10] = ((w5 >> 60) | (w6 << 4)) & mask;
2601   out[11] = ((w6 >> 34) | (w7 << 30)) & mask;
2602   out[12] = (w7 >> 8) & mask;
2603   out[13] = ((w7 >> 46) | (w8 << 18)) & mask;
2604   out[14] = (w8 >> 20) & mask;
2605   out[15] = ((w8 >> 58) | (w9 << 6)) & mask;
2606   out[16] = ((w9 >> 32) | (w10 << 32)) & mask;
2607   out[17] = (w10 >> 6) & mask;
2608   out[18] = ((w10 >> 44) | (w11 << 20)) & mask;
2609   out[19] = (w11 >> 18) & mask;
2610   out[20] = ((w11 >> 56) | (w12 << 8)) & mask;
2611   out[21] = ((w12 >> 30) | (w13 << 34)) & mask;
2612   out[22] = (w13 >> 4) & mask;
2613   out[23] = ((w13 >> 42) | (w14 << 22)) & mask;
2614   out[24] = (w14 >> 16) & mask;
2615   out[25] = ((w14 >> 54) | (w15 << 10)) & mask;
2616   out[26] = ((w15 >> 28) | (w16 << 36)) & mask;
2617   out[27] = (w16 >> 2) & mask;
2618   out[28] = ((w16 >> 40) | (w17 << 24)) & mask;
2619   out[29] = (w17 >> 14) & mask;
2620   out[30] = ((w17 >> 52) | (w18 << 12)) & mask;
2621   out[31] = w18 >> 26;
2622 
2623   return in;
2624 }
2625 
2626 inline const uint8_t* unpack39_64(const uint8_t* in, uint64_t* out) {
2627   const uint64_t mask = 549755813887ULL;
2628   uint64_t w0 = util::SafeLoadAs<uint64_t>(in);
2629   w0 = arrow::bit_util::FromLittleEndian(w0);
2630   in += 8;
2631   uint64_t w1 = util::SafeLoadAs<uint64_t>(in);
2632   w1 = arrow::bit_util::FromLittleEndian(w1);
2633   in += 8;
2634   uint64_t w2 = util::SafeLoadAs<uint64_t>(in);
2635   w2 = arrow::bit_util::FromLittleEndian(w2);
2636   in += 8;
2637   uint64_t w3 = util::SafeLoadAs<uint64_t>(in);
2638   w3 = arrow::bit_util::FromLittleEndian(w3);
2639   in += 8;
2640   uint64_t w4 = util::SafeLoadAs<uint64_t>(in);
2641   w4 = arrow::bit_util::FromLittleEndian(w4);
2642   in += 8;
2643   uint64_t w5 = util::SafeLoadAs<uint64_t>(in);
2644   w5 = arrow::bit_util::FromLittleEndian(w5);
2645   in += 8;
2646   uint64_t w6 = util::SafeLoadAs<uint64_t>(in);
2647   w6 = arrow::bit_util::FromLittleEndian(w6);
2648   in += 8;
2649   uint64_t w7 = util::SafeLoadAs<uint64_t>(in);
2650   w7 = arrow::bit_util::FromLittleEndian(w7);
2651   in += 8;
2652   uint64_t w8 = util::SafeLoadAs<uint64_t>(in);
2653   w8 = arrow::bit_util::FromLittleEndian(w8);
2654   in += 8;
2655   uint64_t w9 = util::SafeLoadAs<uint64_t>(in);
2656   w9 = arrow::bit_util::FromLittleEndian(w9);
2657   in += 8;
2658   uint64_t w10 = util::SafeLoadAs<uint64_t>(in);
2659   w10 = arrow::bit_util::FromLittleEndian(w10);
2660   in += 8;
2661   uint64_t w11 = util::SafeLoadAs<uint64_t>(in);
2662   w11 = arrow::bit_util::FromLittleEndian(w11);
2663   in += 8;
2664   uint64_t w12 = util::SafeLoadAs<uint64_t>(in);
2665   w12 = arrow::bit_util::FromLittleEndian(w12);
2666   in += 8;
2667   uint64_t w13 = util::SafeLoadAs<uint64_t>(in);
2668   w13 = arrow::bit_util::FromLittleEndian(w13);
2669   in += 8;
2670   uint64_t w14 = util::SafeLoadAs<uint64_t>(in);
2671   w14 = arrow::bit_util::FromLittleEndian(w14);
2672   in += 8;
2673   uint64_t w15 = util::SafeLoadAs<uint64_t>(in);
2674   w15 = arrow::bit_util::FromLittleEndian(w15);
2675   in += 8;
2676   uint64_t w16 = util::SafeLoadAs<uint64_t>(in);
2677   w16 = arrow::bit_util::FromLittleEndian(w16);
2678   in += 8;
2679   uint64_t w17 = util::SafeLoadAs<uint64_t>(in);
2680   w17 = arrow::bit_util::FromLittleEndian(w17);
2681   in += 8;
2682   uint64_t w18 = util::SafeLoadAs<uint64_t>(in);
2683   w18 = arrow::bit_util::FromLittleEndian(w18);
2684   in += 8;
2685   uint64_t w19 = util::SafeLoadAs<uint32_t>(in);
2686   w19 = arrow::bit_util::FromLittleEndian(w19);
2687   in += 4;
2688   out[0] = (w0)&mask;
2689   out[1] = ((w0 >> 39) | (w1 << 25)) & mask;
2690   out[2] = (w1 >> 14) & mask;
2691   out[3] = ((w1 >> 53) | (w2 << 11)) & mask;
2692   out[4] = ((w2 >> 28) | (w3 << 36)) & mask;
2693   out[5] = (w3 >> 3) & mask;
2694   out[6] = ((w3 >> 42) | (w4 << 22)) & mask;
2695   out[7] = (w4 >> 17) & mask;
2696   out[8] = ((w4 >> 56) | (w5 << 8)) & mask;
2697   out[9] = ((w5 >> 31) | (w6 << 33)) & mask;
2698   out[10] = (w6 >> 6) & mask;
2699   out[11] = ((w6 >> 45) | (w7 << 19)) & mask;
2700   out[12] = (w7 >> 20) & mask;
2701   out[13] = ((w7 >> 59) | (w8 << 5)) & mask;
2702   out[14] = ((w8 >> 34) | (w9 << 30)) & mask;
2703   out[15] = (w9 >> 9) & mask;
2704   out[16] = ((w9 >> 48) | (w10 << 16)) & mask;
2705   out[17] = (w10 >> 23) & mask;
2706   out[18] = ((w10 >> 62) | (w11 << 2)) & mask;
2707   out[19] = ((w11 >> 37) | (w12 << 27)) & mask;
2708   out[20] = (w12 >> 12) & mask;
2709   out[21] = ((w12 >> 51) | (w13 << 13)) & mask;
2710   out[22] = ((w13 >> 26) | (w14 << 38)) & mask;
2711   out[23] = (w14 >> 1) & mask;
2712   out[24] = ((w14 >> 40) | (w15 << 24)) & mask;
2713   out[25] = (w15 >> 15) & mask;
2714   out[26] = ((w15 >> 54) | (w16 << 10)) & mask;
2715   out[27] = ((w16 >> 29) | (w17 << 35)) & mask;
2716   out[28] = (w17 >> 4) & mask;
2717   out[29] = ((w17 >> 43) | (w18 << 21)) & mask;
2718   out[30] = (w18 >> 18) & mask;
2719   out[31] = ((w18 >> 57) | (w19 << 7)) & mask;
2720 
2721   return in;
2722 }
2723 
2724 inline const uint8_t* unpack40_64(const uint8_t* in, uint64_t* out) {
2725   const uint64_t mask = 1099511627775ULL;
2726   uint64_t w0 = util::SafeLoadAs<uint64_t>(in);
2727   w0 = arrow::bit_util::FromLittleEndian(w0);
2728   in += 8;
2729   uint64_t w1 = util::SafeLoadAs<uint64_t>(in);
2730   w1 = arrow::bit_util::FromLittleEndian(w1);
2731   in += 8;
2732   uint64_t w2 = util::SafeLoadAs<uint64_t>(in);
2733   w2 = arrow::bit_util::FromLittleEndian(w2);
2734   in += 8;
2735   uint64_t w3 = util::SafeLoadAs<uint64_t>(in);
2736   w3 = arrow::bit_util::FromLittleEndian(w3);
2737   in += 8;
2738   uint64_t w4 = util::SafeLoadAs<uint64_t>(in);
2739   w4 = arrow::bit_util::FromLittleEndian(w4);
2740   in += 8;
2741   uint64_t w5 = util::SafeLoadAs<uint64_t>(in);
2742   w5 = arrow::bit_util::FromLittleEndian(w5);
2743   in += 8;
2744   uint64_t w6 = util::SafeLoadAs<uint64_t>(in);
2745   w6 = arrow::bit_util::FromLittleEndian(w6);
2746   in += 8;
2747   uint64_t w7 = util::SafeLoadAs<uint64_t>(in);
2748   w7 = arrow::bit_util::FromLittleEndian(w7);
2749   in += 8;
2750   uint64_t w8 = util::SafeLoadAs<uint64_t>(in);
2751   w8 = arrow::bit_util::FromLittleEndian(w8);
2752   in += 8;
2753   uint64_t w9 = util::SafeLoadAs<uint64_t>(in);
2754   w9 = arrow::bit_util::FromLittleEndian(w9);
2755   in += 8;
2756   uint64_t w10 = util::SafeLoadAs<uint64_t>(in);
2757   w10 = arrow::bit_util::FromLittleEndian(w10);
2758   in += 8;
2759   uint64_t w11 = util::SafeLoadAs<uint64_t>(in);
2760   w11 = arrow::bit_util::FromLittleEndian(w11);
2761   in += 8;
2762   uint64_t w12 = util::SafeLoadAs<uint64_t>(in);
2763   w12 = arrow::bit_util::FromLittleEndian(w12);
2764   in += 8;
2765   uint64_t w13 = util::SafeLoadAs<uint64_t>(in);
2766   w13 = arrow::bit_util::FromLittleEndian(w13);
2767   in += 8;
2768   uint64_t w14 = util::SafeLoadAs<uint64_t>(in);
2769   w14 = arrow::bit_util::FromLittleEndian(w14);
2770   in += 8;
2771   uint64_t w15 = util::SafeLoadAs<uint64_t>(in);
2772   w15 = arrow::bit_util::FromLittleEndian(w15);
2773   in += 8;
2774   uint64_t w16 = util::SafeLoadAs<uint64_t>(in);
2775   w16 = arrow::bit_util::FromLittleEndian(w16);
2776   in += 8;
2777   uint64_t w17 = util::SafeLoadAs<uint64_t>(in);
2778   w17 = arrow::bit_util::FromLittleEndian(w17);
2779   in += 8;
2780   uint64_t w18 = util::SafeLoadAs<uint64_t>(in);
2781   w18 = arrow::bit_util::FromLittleEndian(w18);
2782   in += 8;
2783   uint64_t w19 = util::SafeLoadAs<uint64_t>(in);
2784   w19 = arrow::bit_util::FromLittleEndian(w19);
2785   in += 8;
2786   out[0] = (w0)&mask;
2787   out[1] = ((w0 >> 40) | (w1 << 24)) & mask;
2788   out[2] = (w1 >> 16) & mask;
2789   out[3] = ((w1 >> 56) | (w2 << 8)) & mask;
2790   out[4] = ((w2 >> 32) | (w3 << 32)) & mask;
2791   out[5] = (w3 >> 8) & mask;
2792   out[6] = ((w3 >> 48) | (w4 << 16)) & mask;
2793   out[7] = w4 >> 24;
2794   out[8] = (w5)&mask;
2795   out[9] = ((w5 >> 40) | (w6 << 24)) & mask;
2796   out[10] = (w6 >> 16) & mask;
2797   out[11] = ((w6 >> 56) | (w7 << 8)) & mask;
2798   out[12] = ((w7 >> 32) | (w8 << 32)) & mask;
2799   out[13] = (w8 >> 8) & mask;
2800   out[14] = ((w8 >> 48) | (w9 << 16)) & mask;
2801   out[15] = w9 >> 24;
2802   out[16] = (w10)&mask;
2803   out[17] = ((w10 >> 40) | (w11 << 24)) & mask;
2804   out[18] = (w11 >> 16) & mask;
2805   out[19] = ((w11 >> 56) | (w12 << 8)) & mask;
2806   out[20] = ((w12 >> 32) | (w13 << 32)) & mask;
2807   out[21] = (w13 >> 8) & mask;
2808   out[22] = ((w13 >> 48) | (w14 << 16)) & mask;
2809   out[23] = w14 >> 24;
2810   out[24] = (w15)&mask;
2811   out[25] = ((w15 >> 40) | (w16 << 24)) & mask;
2812   out[26] = (w16 >> 16) & mask;
2813   out[27] = ((w16 >> 56) | (w17 << 8)) & mask;
2814   out[28] = ((w17 >> 32) | (w18 << 32)) & mask;
2815   out[29] = (w18 >> 8) & mask;
2816   out[30] = ((w18 >> 48) | (w19 << 16)) & mask;
2817   out[31] = w19 >> 24;
2818 
2819   return in;
2820 }
2821 
2822 inline const uint8_t* unpack41_64(const uint8_t* in, uint64_t* out) {
2823   const uint64_t mask = 2199023255551ULL;
2824   uint64_t w0 = util::SafeLoadAs<uint64_t>(in);
2825   w0 = arrow::bit_util::FromLittleEndian(w0);
2826   in += 8;
2827   uint64_t w1 = util::SafeLoadAs<uint64_t>(in);
2828   w1 = arrow::bit_util::FromLittleEndian(w1);
2829   in += 8;
2830   uint64_t w2 = util::SafeLoadAs<uint64_t>(in);
2831   w2 = arrow::bit_util::FromLittleEndian(w2);
2832   in += 8;
2833   uint64_t w3 = util::SafeLoadAs<uint64_t>(in);
2834   w3 = arrow::bit_util::FromLittleEndian(w3);
2835   in += 8;
2836   uint64_t w4 = util::SafeLoadAs<uint64_t>(in);
2837   w4 = arrow::bit_util::FromLittleEndian(w4);
2838   in += 8;
2839   uint64_t w5 = util::SafeLoadAs<uint64_t>(in);
2840   w5 = arrow::bit_util::FromLittleEndian(w5);
2841   in += 8;
2842   uint64_t w6 = util::SafeLoadAs<uint64_t>(in);
2843   w6 = arrow::bit_util::FromLittleEndian(w6);
2844   in += 8;
2845   uint64_t w7 = util::SafeLoadAs<uint64_t>(in);
2846   w7 = arrow::bit_util::FromLittleEndian(w7);
2847   in += 8;
2848   uint64_t w8 = util::SafeLoadAs<uint64_t>(in);
2849   w8 = arrow::bit_util::FromLittleEndian(w8);
2850   in += 8;
2851   uint64_t w9 = util::SafeLoadAs<uint64_t>(in);
2852   w9 = arrow::bit_util::FromLittleEndian(w9);
2853   in += 8;
2854   uint64_t w10 = util::SafeLoadAs<uint64_t>(in);
2855   w10 = arrow::bit_util::FromLittleEndian(w10);
2856   in += 8;
2857   uint64_t w11 = util::SafeLoadAs<uint64_t>(in);
2858   w11 = arrow::bit_util::FromLittleEndian(w11);
2859   in += 8;
2860   uint64_t w12 = util::SafeLoadAs<uint64_t>(in);
2861   w12 = arrow::bit_util::FromLittleEndian(w12);
2862   in += 8;
2863   uint64_t w13 = util::SafeLoadAs<uint64_t>(in);
2864   w13 = arrow::bit_util::FromLittleEndian(w13);
2865   in += 8;
2866   uint64_t w14 = util::SafeLoadAs<uint64_t>(in);
2867   w14 = arrow::bit_util::FromLittleEndian(w14);
2868   in += 8;
2869   uint64_t w15 = util::SafeLoadAs<uint64_t>(in);
2870   w15 = arrow::bit_util::FromLittleEndian(w15);
2871   in += 8;
2872   uint64_t w16 = util::SafeLoadAs<uint64_t>(in);
2873   w16 = arrow::bit_util::FromLittleEndian(w16);
2874   in += 8;
2875   uint64_t w17 = util::SafeLoadAs<uint64_t>(in);
2876   w17 = arrow::bit_util::FromLittleEndian(w17);
2877   in += 8;
2878   uint64_t w18 = util::SafeLoadAs<uint64_t>(in);
2879   w18 = arrow::bit_util::FromLittleEndian(w18);
2880   in += 8;
2881   uint64_t w19 = util::SafeLoadAs<uint64_t>(in);
2882   w19 = arrow::bit_util::FromLittleEndian(w19);
2883   in += 8;
2884   uint64_t w20 = util::SafeLoadAs<uint32_t>(in);
2885   w20 = arrow::bit_util::FromLittleEndian(w20);
2886   in += 4;
2887   out[0] = (w0)&mask;
2888   out[1] = ((w0 >> 41) | (w1 << 23)) & mask;
2889   out[2] = (w1 >> 18) & mask;
2890   out[3] = ((w1 >> 59) | (w2 << 5)) & mask;
2891   out[4] = ((w2 >> 36) | (w3 << 28)) & mask;
2892   out[5] = (w3 >> 13) & mask;
2893   out[6] = ((w3 >> 54) | (w4 << 10)) & mask;
2894   out[7] = ((w4 >> 31) | (w5 << 33)) & mask;
2895   out[8] = (w5 >> 8) & mask;
2896   out[9] = ((w5 >> 49) | (w6 << 15)) & mask;
2897   out[10] = ((w6 >> 26) | (w7 << 38)) & mask;
2898   out[11] = (w7 >> 3) & mask;
2899   out[12] = ((w7 >> 44) | (w8 << 20)) & mask;
2900   out[13] = (w8 >> 21) & mask;
2901   out[14] = ((w8 >> 62) | (w9 << 2)) & mask;
2902   out[15] = ((w9 >> 39) | (w10 << 25)) & mask;
2903   out[16] = (w10 >> 16) & mask;
2904   out[17] = ((w10 >> 57) | (w11 << 7)) & mask;
2905   out[18] = ((w11 >> 34) | (w12 << 30)) & mask;
2906   out[19] = (w12 >> 11) & mask;
2907   out[20] = ((w12 >> 52) | (w13 << 12)) & mask;
2908   out[21] = ((w13 >> 29) | (w14 << 35)) & mask;
2909   out[22] = (w14 >> 6) & mask;
2910   out[23] = ((w14 >> 47) | (w15 << 17)) & mask;
2911   out[24] = ((w15 >> 24) | (w16 << 40)) & mask;
2912   out[25] = (w16 >> 1) & mask;
2913   out[26] = ((w16 >> 42) | (w17 << 22)) & mask;
2914   out[27] = (w17 >> 19) & mask;
2915   out[28] = ((w17 >> 60) | (w18 << 4)) & mask;
2916   out[29] = ((w18 >> 37) | (w19 << 27)) & mask;
2917   out[30] = (w19 >> 14) & mask;
2918   out[31] = ((w19 >> 55) | (w20 << 9)) & mask;
2919 
2920   return in;
2921 }
2922 
2923 inline const uint8_t* unpack42_64(const uint8_t* in, uint64_t* out) {
2924   const uint64_t mask = 4398046511103ULL;
2925   uint64_t w0 = util::SafeLoadAs<uint64_t>(in);
2926   w0 = arrow::bit_util::FromLittleEndian(w0);
2927   in += 8;
2928   uint64_t w1 = util::SafeLoadAs<uint64_t>(in);
2929   w1 = arrow::bit_util::FromLittleEndian(w1);
2930   in += 8;
2931   uint64_t w2 = util::SafeLoadAs<uint64_t>(in);
2932   w2 = arrow::bit_util::FromLittleEndian(w2);
2933   in += 8;
2934   uint64_t w3 = util::SafeLoadAs<uint64_t>(in);
2935   w3 = arrow::bit_util::FromLittleEndian(w3);
2936   in += 8;
2937   uint64_t w4 = util::SafeLoadAs<uint64_t>(in);
2938   w4 = arrow::bit_util::FromLittleEndian(w4);
2939   in += 8;
2940   uint64_t w5 = util::SafeLoadAs<uint64_t>(in);
2941   w5 = arrow::bit_util::FromLittleEndian(w5);
2942   in += 8;
2943   uint64_t w6 = util::SafeLoadAs<uint64_t>(in);
2944   w6 = arrow::bit_util::FromLittleEndian(w6);
2945   in += 8;
2946   uint64_t w7 = util::SafeLoadAs<uint64_t>(in);
2947   w7 = arrow::bit_util::FromLittleEndian(w7);
2948   in += 8;
2949   uint64_t w8 = util::SafeLoadAs<uint64_t>(in);
2950   w8 = arrow::bit_util::FromLittleEndian(w8);
2951   in += 8;
2952   uint64_t w9 = util::SafeLoadAs<uint64_t>(in);
2953   w9 = arrow::bit_util::FromLittleEndian(w9);
2954   in += 8;
2955   uint64_t w10 = util::SafeLoadAs<uint64_t>(in);
2956   w10 = arrow::bit_util::FromLittleEndian(w10);
2957   in += 8;
2958   uint64_t w11 = util::SafeLoadAs<uint64_t>(in);
2959   w11 = arrow::bit_util::FromLittleEndian(w11);
2960   in += 8;
2961   uint64_t w12 = util::SafeLoadAs<uint64_t>(in);
2962   w12 = arrow::bit_util::FromLittleEndian(w12);
2963   in += 8;
2964   uint64_t w13 = util::SafeLoadAs<uint64_t>(in);
2965   w13 = arrow::bit_util::FromLittleEndian(w13);
2966   in += 8;
2967   uint64_t w14 = util::SafeLoadAs<uint64_t>(in);
2968   w14 = arrow::bit_util::FromLittleEndian(w14);
2969   in += 8;
2970   uint64_t w15 = util::SafeLoadAs<uint64_t>(in);
2971   w15 = arrow::bit_util::FromLittleEndian(w15);
2972   in += 8;
2973   uint64_t w16 = util::SafeLoadAs<uint64_t>(in);
2974   w16 = arrow::bit_util::FromLittleEndian(w16);
2975   in += 8;
2976   uint64_t w17 = util::SafeLoadAs<uint64_t>(in);
2977   w17 = arrow::bit_util::FromLittleEndian(w17);
2978   in += 8;
2979   uint64_t w18 = util::SafeLoadAs<uint64_t>(in);
2980   w18 = arrow::bit_util::FromLittleEndian(w18);
2981   in += 8;
2982   uint64_t w19 = util::SafeLoadAs<uint64_t>(in);
2983   w19 = arrow::bit_util::FromLittleEndian(w19);
2984   in += 8;
2985   uint64_t w20 = util::SafeLoadAs<uint64_t>(in);
2986   w20 = arrow::bit_util::FromLittleEndian(w20);
2987   in += 8;
2988   out[0] = (w0)&mask;
2989   out[1] = ((w0 >> 42) | (w1 << 22)) & mask;
2990   out[2] = (w1 >> 20) & mask;
2991   out[3] = ((w1 >> 62) | (w2 << 2)) & mask;
2992   out[4] = ((w2 >> 40) | (w3 << 24)) & mask;
2993   out[5] = (w3 >> 18) & mask;
2994   out[6] = ((w3 >> 60) | (w4 << 4)) & mask;
2995   out[7] = ((w4 >> 38) | (w5 << 26)) & mask;
2996   out[8] = (w5 >> 16) & mask;
2997   out[9] = ((w5 >> 58) | (w6 << 6)) & mask;
2998   out[10] = ((w6 >> 36) | (w7 << 28)) & mask;
2999   out[11] = (w7 >> 14) & mask;
3000   out[12] = ((w7 >> 56) | (w8 << 8)) & mask;
3001   out[13] = ((w8 >> 34) | (w9 << 30)) & mask;
3002   out[14] = (w9 >> 12) & mask;
3003   out[15] = ((w9 >> 54) | (w10 << 10)) & mask;
3004   out[16] = ((w10 >> 32) | (w11 << 32)) & mask;
3005   out[17] = (w11 >> 10) & mask;
3006   out[18] = ((w11 >> 52) | (w12 << 12)) & mask;
3007   out[19] = ((w12 >> 30) | (w13 << 34)) & mask;
3008   out[20] = (w13 >> 8) & mask;
3009   out[21] = ((w13 >> 50) | (w14 << 14)) & mask;
3010   out[22] = ((w14 >> 28) | (w15 << 36)) & mask;
3011   out[23] = (w15 >> 6) & mask;
3012   out[24] = ((w15 >> 48) | (w16 << 16)) & mask;
3013   out[25] = ((w16 >> 26) | (w17 << 38)) & mask;
3014   out[26] = (w17 >> 4) & mask;
3015   out[27] = ((w17 >> 46) | (w18 << 18)) & mask;
3016   out[28] = ((w18 >> 24) | (w19 << 40)) & mask;
3017   out[29] = (w19 >> 2) & mask;
3018   out[30] = ((w19 >> 44) | (w20 << 20)) & mask;
3019   out[31] = w20 >> 22;
3020 
3021   return in;
3022 }
3023 
3024 inline const uint8_t* unpack43_64(const uint8_t* in, uint64_t* out) {
3025   const uint64_t mask = 8796093022207ULL;
3026   uint64_t w0 = util::SafeLoadAs<uint64_t>(in);
3027   w0 = arrow::bit_util::FromLittleEndian(w0);
3028   in += 8;
3029   uint64_t w1 = util::SafeLoadAs<uint64_t>(in);
3030   w1 = arrow::bit_util::FromLittleEndian(w1);
3031   in += 8;
3032   uint64_t w2 = util::SafeLoadAs<uint64_t>(in);
3033   w2 = arrow::bit_util::FromLittleEndian(w2);
3034   in += 8;
3035   uint64_t w3 = util::SafeLoadAs<uint64_t>(in);
3036   w3 = arrow::bit_util::FromLittleEndian(w3);
3037   in += 8;
3038   uint64_t w4 = util::SafeLoadAs<uint64_t>(in);
3039   w4 = arrow::bit_util::FromLittleEndian(w4);
3040   in += 8;
3041   uint64_t w5 = util::SafeLoadAs<uint64_t>(in);
3042   w5 = arrow::bit_util::FromLittleEndian(w5);
3043   in += 8;
3044   uint64_t w6 = util::SafeLoadAs<uint64_t>(in);
3045   w6 = arrow::bit_util::FromLittleEndian(w6);
3046   in += 8;
3047   uint64_t w7 = util::SafeLoadAs<uint64_t>(in);
3048   w7 = arrow::bit_util::FromLittleEndian(w7);
3049   in += 8;
3050   uint64_t w8 = util::SafeLoadAs<uint64_t>(in);
3051   w8 = arrow::bit_util::FromLittleEndian(w8);
3052   in += 8;
3053   uint64_t w9 = util::SafeLoadAs<uint64_t>(in);
3054   w9 = arrow::bit_util::FromLittleEndian(w9);
3055   in += 8;
3056   uint64_t w10 = util::SafeLoadAs<uint64_t>(in);
3057   w10 = arrow::bit_util::FromLittleEndian(w10);
3058   in += 8;
3059   uint64_t w11 = util::SafeLoadAs<uint64_t>(in);
3060   w11 = arrow::bit_util::FromLittleEndian(w11);
3061   in += 8;
3062   uint64_t w12 = util::SafeLoadAs<uint64_t>(in);
3063   w12 = arrow::bit_util::FromLittleEndian(w12);
3064   in += 8;
3065   uint64_t w13 = util::SafeLoadAs<uint64_t>(in);
3066   w13 = arrow::bit_util::FromLittleEndian(w13);
3067   in += 8;
3068   uint64_t w14 = util::SafeLoadAs<uint64_t>(in);
3069   w14 = arrow::bit_util::FromLittleEndian(w14);
3070   in += 8;
3071   uint64_t w15 = util::SafeLoadAs<uint64_t>(in);
3072   w15 = arrow::bit_util::FromLittleEndian(w15);
3073   in += 8;
3074   uint64_t w16 = util::SafeLoadAs<uint64_t>(in);
3075   w16 = arrow::bit_util::FromLittleEndian(w16);
3076   in += 8;
3077   uint64_t w17 = util::SafeLoadAs<uint64_t>(in);
3078   w17 = arrow::bit_util::FromLittleEndian(w17);
3079   in += 8;
3080   uint64_t w18 = util::SafeLoadAs<uint64_t>(in);
3081   w18 = arrow::bit_util::FromLittleEndian(w18);
3082   in += 8;
3083   uint64_t w19 = util::SafeLoadAs<uint64_t>(in);
3084   w19 = arrow::bit_util::FromLittleEndian(w19);
3085   in += 8;
3086   uint64_t w20 = util::SafeLoadAs<uint64_t>(in);
3087   w20 = arrow::bit_util::FromLittleEndian(w20);
3088   in += 8;
3089   uint64_t w21 = util::SafeLoadAs<uint32_t>(in);
3090   w21 = arrow::bit_util::FromLittleEndian(w21);
3091   in += 4;
3092   out[0] = (w0)&mask;
3093   out[1] = ((w0 >> 43) | (w1 << 21)) & mask;
3094   out[2] = ((w1 >> 22) | (w2 << 42)) & mask;
3095   out[3] = (w2 >> 1) & mask;
3096   out[4] = ((w2 >> 44) | (w3 << 20)) & mask;
3097   out[5] = ((w3 >> 23) | (w4 << 41)) & mask;
3098   out[6] = (w4 >> 2) & mask;
3099   out[7] = ((w4 >> 45) | (w5 << 19)) & mask;
3100   out[8] = ((w5 >> 24) | (w6 << 40)) & mask;
3101   out[9] = (w6 >> 3) & mask;
3102   out[10] = ((w6 >> 46) | (w7 << 18)) & mask;
3103   out[11] = ((w7 >> 25) | (w8 << 39)) & mask;
3104   out[12] = (w8 >> 4) & mask;
3105   out[13] = ((w8 >> 47) | (w9 << 17)) & mask;
3106   out[14] = ((w9 >> 26) | (w10 << 38)) & mask;
3107   out[15] = (w10 >> 5) & mask;
3108   out[16] = ((w10 >> 48) | (w11 << 16)) & mask;
3109   out[17] = ((w11 >> 27) | (w12 << 37)) & mask;
3110   out[18] = (w12 >> 6) & mask;
3111   out[19] = ((w12 >> 49) | (w13 << 15)) & mask;
3112   out[20] = ((w13 >> 28) | (w14 << 36)) & mask;
3113   out[21] = (w14 >> 7) & mask;
3114   out[22] = ((w14 >> 50) | (w15 << 14)) & mask;
3115   out[23] = ((w15 >> 29) | (w16 << 35)) & mask;
3116   out[24] = (w16 >> 8) & mask;
3117   out[25] = ((w16 >> 51) | (w17 << 13)) & mask;
3118   out[26] = ((w17 >> 30) | (w18 << 34)) & mask;
3119   out[27] = (w18 >> 9) & mask;
3120   out[28] = ((w18 >> 52) | (w19 << 12)) & mask;
3121   out[29] = ((w19 >> 31) | (w20 << 33)) & mask;
3122   out[30] = (w20 >> 10) & mask;
3123   out[31] = ((w20 >> 53) | (w21 << 11)) & mask;
3124 
3125   return in;
3126 }
3127 
3128 inline const uint8_t* unpack44_64(const uint8_t* in, uint64_t* out) {
3129   const uint64_t mask = 17592186044415ULL;
3130   uint64_t w0 = util::SafeLoadAs<uint64_t>(in);
3131   w0 = arrow::bit_util::FromLittleEndian(w0);
3132   in += 8;
3133   uint64_t w1 = util::SafeLoadAs<uint64_t>(in);
3134   w1 = arrow::bit_util::FromLittleEndian(w1);
3135   in += 8;
3136   uint64_t w2 = util::SafeLoadAs<uint64_t>(in);
3137   w2 = arrow::bit_util::FromLittleEndian(w2);
3138   in += 8;
3139   uint64_t w3 = util::SafeLoadAs<uint64_t>(in);
3140   w3 = arrow::bit_util::FromLittleEndian(w3);
3141   in += 8;
3142   uint64_t w4 = util::SafeLoadAs<uint64_t>(in);
3143   w4 = arrow::bit_util::FromLittleEndian(w4);
3144   in += 8;
3145   uint64_t w5 = util::SafeLoadAs<uint64_t>(in);
3146   w5 = arrow::bit_util::FromLittleEndian(w5);
3147   in += 8;
3148   uint64_t w6 = util::SafeLoadAs<uint64_t>(in);
3149   w6 = arrow::bit_util::FromLittleEndian(w6);
3150   in += 8;
3151   uint64_t w7 = util::SafeLoadAs<uint64_t>(in);
3152   w7 = arrow::bit_util::FromLittleEndian(w7);
3153   in += 8;
3154   uint64_t w8 = util::SafeLoadAs<uint64_t>(in);
3155   w8 = arrow::bit_util::FromLittleEndian(w8);
3156   in += 8;
3157   uint64_t w9 = util::SafeLoadAs<uint64_t>(in);
3158   w9 = arrow::bit_util::FromLittleEndian(w9);
3159   in += 8;
3160   uint64_t w10 = util::SafeLoadAs<uint64_t>(in);
3161   w10 = arrow::bit_util::FromLittleEndian(w10);
3162   in += 8;
3163   uint64_t w11 = util::SafeLoadAs<uint64_t>(in);
3164   w11 = arrow::bit_util::FromLittleEndian(w11);
3165   in += 8;
3166   uint64_t w12 = util::SafeLoadAs<uint64_t>(in);
3167   w12 = arrow::bit_util::FromLittleEndian(w12);
3168   in += 8;
3169   uint64_t w13 = util::SafeLoadAs<uint64_t>(in);
3170   w13 = arrow::bit_util::FromLittleEndian(w13);
3171   in += 8;
3172   uint64_t w14 = util::SafeLoadAs<uint64_t>(in);
3173   w14 = arrow::bit_util::FromLittleEndian(w14);
3174   in += 8;
3175   uint64_t w15 = util::SafeLoadAs<uint64_t>(in);
3176   w15 = arrow::bit_util::FromLittleEndian(w15);
3177   in += 8;
3178   uint64_t w16 = util::SafeLoadAs<uint64_t>(in);
3179   w16 = arrow::bit_util::FromLittleEndian(w16);
3180   in += 8;
3181   uint64_t w17 = util::SafeLoadAs<uint64_t>(in);
3182   w17 = arrow::bit_util::FromLittleEndian(w17);
3183   in += 8;
3184   uint64_t w18 = util::SafeLoadAs<uint64_t>(in);
3185   w18 = arrow::bit_util::FromLittleEndian(w18);
3186   in += 8;
3187   uint64_t w19 = util::SafeLoadAs<uint64_t>(in);
3188   w19 = arrow::bit_util::FromLittleEndian(w19);
3189   in += 8;
3190   uint64_t w20 = util::SafeLoadAs<uint64_t>(in);
3191   w20 = arrow::bit_util::FromLittleEndian(w20);
3192   in += 8;
3193   uint64_t w21 = util::SafeLoadAs<uint64_t>(in);
3194   w21 = arrow::bit_util::FromLittleEndian(w21);
3195   in += 8;
3196   out[0] = (w0)&mask;
3197   out[1] = ((w0 >> 44) | (w1 << 20)) & mask;
3198   out[2] = ((w1 >> 24) | (w2 << 40)) & mask;
3199   out[3] = (w2 >> 4) & mask;
3200   out[4] = ((w2 >> 48) | (w3 << 16)) & mask;
3201   out[5] = ((w3 >> 28) | (w4 << 36)) & mask;
3202   out[6] = (w4 >> 8) & mask;
3203   out[7] = ((w4 >> 52) | (w5 << 12)) & mask;
3204   out[8] = ((w5 >> 32) | (w6 << 32)) & mask;
3205   out[9] = (w6 >> 12) & mask;
3206   out[10] = ((w6 >> 56) | (w7 << 8)) & mask;
3207   out[11] = ((w7 >> 36) | (w8 << 28)) & mask;
3208   out[12] = (w8 >> 16) & mask;
3209   out[13] = ((w8 >> 60) | (w9 << 4)) & mask;
3210   out[14] = ((w9 >> 40) | (w10 << 24)) & mask;
3211   out[15] = w10 >> 20;
3212   out[16] = (w11)&mask;
3213   out[17] = ((w11 >> 44) | (w12 << 20)) & mask;
3214   out[18] = ((w12 >> 24) | (w13 << 40)) & mask;
3215   out[19] = (w13 >> 4) & mask;
3216   out[20] = ((w13 >> 48) | (w14 << 16)) & mask;
3217   out[21] = ((w14 >> 28) | (w15 << 36)) & mask;
3218   out[22] = (w15 >> 8) & mask;
3219   out[23] = ((w15 >> 52) | (w16 << 12)) & mask;
3220   out[24] = ((w16 >> 32) | (w17 << 32)) & mask;
3221   out[25] = (w17 >> 12) & mask;
3222   out[26] = ((w17 >> 56) | (w18 << 8)) & mask;
3223   out[27] = ((w18 >> 36) | (w19 << 28)) & mask;
3224   out[28] = (w19 >> 16) & mask;
3225   out[29] = ((w19 >> 60) | (w20 << 4)) & mask;
3226   out[30] = ((w20 >> 40) | (w21 << 24)) & mask;
3227   out[31] = w21 >> 20;
3228 
3229   return in;
3230 }
3231 
3232 inline const uint8_t* unpack45_64(const uint8_t* in, uint64_t* out) {
3233   const uint64_t mask = 35184372088831ULL;
3234   uint64_t w0 = util::SafeLoadAs<uint64_t>(in);
3235   w0 = arrow::bit_util::FromLittleEndian(w0);
3236   in += 8;
3237   uint64_t w1 = util::SafeLoadAs<uint64_t>(in);
3238   w1 = arrow::bit_util::FromLittleEndian(w1);
3239   in += 8;
3240   uint64_t w2 = util::SafeLoadAs<uint64_t>(in);
3241   w2 = arrow::bit_util::FromLittleEndian(w2);
3242   in += 8;
3243   uint64_t w3 = util::SafeLoadAs<uint64_t>(in);
3244   w3 = arrow::bit_util::FromLittleEndian(w3);
3245   in += 8;
3246   uint64_t w4 = util::SafeLoadAs<uint64_t>(in);
3247   w4 = arrow::bit_util::FromLittleEndian(w4);
3248   in += 8;
3249   uint64_t w5 = util::SafeLoadAs<uint64_t>(in);
3250   w5 = arrow::bit_util::FromLittleEndian(w5);
3251   in += 8;
3252   uint64_t w6 = util::SafeLoadAs<uint64_t>(in);
3253   w6 = arrow::bit_util::FromLittleEndian(w6);
3254   in += 8;
3255   uint64_t w7 = util::SafeLoadAs<uint64_t>(in);
3256   w7 = arrow::bit_util::FromLittleEndian(w7);
3257   in += 8;
3258   uint64_t w8 = util::SafeLoadAs<uint64_t>(in);
3259   w8 = arrow::bit_util::FromLittleEndian(w8);
3260   in += 8;
3261   uint64_t w9 = util::SafeLoadAs<uint64_t>(in);
3262   w9 = arrow::bit_util::FromLittleEndian(w9);
3263   in += 8;
3264   uint64_t w10 = util::SafeLoadAs<uint64_t>(in);
3265   w10 = arrow::bit_util::FromLittleEndian(w10);
3266   in += 8;
3267   uint64_t w11 = util::SafeLoadAs<uint64_t>(in);
3268   w11 = arrow::bit_util::FromLittleEndian(w11);
3269   in += 8;
3270   uint64_t w12 = util::SafeLoadAs<uint64_t>(in);
3271   w12 = arrow::bit_util::FromLittleEndian(w12);
3272   in += 8;
3273   uint64_t w13 = util::SafeLoadAs<uint64_t>(in);
3274   w13 = arrow::bit_util::FromLittleEndian(w13);
3275   in += 8;
3276   uint64_t w14 = util::SafeLoadAs<uint64_t>(in);
3277   w14 = arrow::bit_util::FromLittleEndian(w14);
3278   in += 8;
3279   uint64_t w15 = util::SafeLoadAs<uint64_t>(in);
3280   w15 = arrow::bit_util::FromLittleEndian(w15);
3281   in += 8;
3282   uint64_t w16 = util::SafeLoadAs<uint64_t>(in);
3283   w16 = arrow::bit_util::FromLittleEndian(w16);
3284   in += 8;
3285   uint64_t w17 = util::SafeLoadAs<uint64_t>(in);
3286   w17 = arrow::bit_util::FromLittleEndian(w17);
3287   in += 8;
3288   uint64_t w18 = util::SafeLoadAs<uint64_t>(in);
3289   w18 = arrow::bit_util::FromLittleEndian(w18);
3290   in += 8;
3291   uint64_t w19 = util::SafeLoadAs<uint64_t>(in);
3292   w19 = arrow::bit_util::FromLittleEndian(w19);
3293   in += 8;
3294   uint64_t w20 = util::SafeLoadAs<uint64_t>(in);
3295   w20 = arrow::bit_util::FromLittleEndian(w20);
3296   in += 8;
3297   uint64_t w21 = util::SafeLoadAs<uint64_t>(in);
3298   w21 = arrow::bit_util::FromLittleEndian(w21);
3299   in += 8;
3300   uint64_t w22 = util::SafeLoadAs<uint32_t>(in);
3301   w22 = arrow::bit_util::FromLittleEndian(w22);
3302   in += 4;
3303   out[0] = (w0)&mask;
3304   out[1] = ((w0 >> 45) | (w1 << 19)) & mask;
3305   out[2] = ((w1 >> 26) | (w2 << 38)) & mask;
3306   out[3] = (w2 >> 7) & mask;
3307   out[4] = ((w2 >> 52) | (w3 << 12)) & mask;
3308   out[5] = ((w3 >> 33) | (w4 << 31)) & mask;
3309   out[6] = (w4 >> 14) & mask;
3310   out[7] = ((w4 >> 59) | (w5 << 5)) & mask;
3311   out[8] = ((w5 >> 40) | (w6 << 24)) & mask;
3312   out[9] = ((w6 >> 21) | (w7 << 43)) & mask;
3313   out[10] = (w7 >> 2) & mask;
3314   out[11] = ((w7 >> 47) | (w8 << 17)) & mask;
3315   out[12] = ((w8 >> 28) | (w9 << 36)) & mask;
3316   out[13] = (w9 >> 9) & mask;
3317   out[14] = ((w9 >> 54) | (w10 << 10)) & mask;
3318   out[15] = ((w10 >> 35) | (w11 << 29)) & mask;
3319   out[16] = (w11 >> 16) & mask;
3320   out[17] = ((w11 >> 61) | (w12 << 3)) & mask;
3321   out[18] = ((w12 >> 42) | (w13 << 22)) & mask;
3322   out[19] = ((w13 >> 23) | (w14 << 41)) & mask;
3323   out[20] = (w14 >> 4) & mask;
3324   out[21] = ((w14 >> 49) | (w15 << 15)) & mask;
3325   out[22] = ((w15 >> 30) | (w16 << 34)) & mask;
3326   out[23] = (w16 >> 11) & mask;
3327   out[24] = ((w16 >> 56) | (w17 << 8)) & mask;
3328   out[25] = ((w17 >> 37) | (w18 << 27)) & mask;
3329   out[26] = (w18 >> 18) & mask;
3330   out[27] = ((w18 >> 63) | (w19 << 1)) & mask;
3331   out[28] = ((w19 >> 44) | (w20 << 20)) & mask;
3332   out[29] = ((w20 >> 25) | (w21 << 39)) & mask;
3333   out[30] = (w21 >> 6) & mask;
3334   out[31] = ((w21 >> 51) | (w22 << 13)) & mask;
3335 
3336   return in;
3337 }
3338 
3339 inline const uint8_t* unpack46_64(const uint8_t* in, uint64_t* out) {
3340   const uint64_t mask = 70368744177663ULL;
3341   uint64_t w0 = util::SafeLoadAs<uint64_t>(in);
3342   w0 = arrow::bit_util::FromLittleEndian(w0);
3343   in += 8;
3344   uint64_t w1 = util::SafeLoadAs<uint64_t>(in);
3345   w1 = arrow::bit_util::FromLittleEndian(w1);
3346   in += 8;
3347   uint64_t w2 = util::SafeLoadAs<uint64_t>(in);
3348   w2 = arrow::bit_util::FromLittleEndian(w2);
3349   in += 8;
3350   uint64_t w3 = util::SafeLoadAs<uint64_t>(in);
3351   w3 = arrow::bit_util::FromLittleEndian(w3);
3352   in += 8;
3353   uint64_t w4 = util::SafeLoadAs<uint64_t>(in);
3354   w4 = arrow::bit_util::FromLittleEndian(w4);
3355   in += 8;
3356   uint64_t w5 = util::SafeLoadAs<uint64_t>(in);
3357   w5 = arrow::bit_util::FromLittleEndian(w5);
3358   in += 8;
3359   uint64_t w6 = util::SafeLoadAs<uint64_t>(in);
3360   w6 = arrow::bit_util::FromLittleEndian(w6);
3361   in += 8;
3362   uint64_t w7 = util::SafeLoadAs<uint64_t>(in);
3363   w7 = arrow::bit_util::FromLittleEndian(w7);
3364   in += 8;
3365   uint64_t w8 = util::SafeLoadAs<uint64_t>(in);
3366   w8 = arrow::bit_util::FromLittleEndian(w8);
3367   in += 8;
3368   uint64_t w9 = util::SafeLoadAs<uint64_t>(in);
3369   w9 = arrow::bit_util::FromLittleEndian(w9);
3370   in += 8;
3371   uint64_t w10 = util::SafeLoadAs<uint64_t>(in);
3372   w10 = arrow::bit_util::FromLittleEndian(w10);
3373   in += 8;
3374   uint64_t w11 = util::SafeLoadAs<uint64_t>(in);
3375   w11 = arrow::bit_util::FromLittleEndian(w11);
3376   in += 8;
3377   uint64_t w12 = util::SafeLoadAs<uint64_t>(in);
3378   w12 = arrow::bit_util::FromLittleEndian(w12);
3379   in += 8;
3380   uint64_t w13 = util::SafeLoadAs<uint64_t>(in);
3381   w13 = arrow::bit_util::FromLittleEndian(w13);
3382   in += 8;
3383   uint64_t w14 = util::SafeLoadAs<uint64_t>(in);
3384   w14 = arrow::bit_util::FromLittleEndian(w14);
3385   in += 8;
3386   uint64_t w15 = util::SafeLoadAs<uint64_t>(in);
3387   w15 = arrow::bit_util::FromLittleEndian(w15);
3388   in += 8;
3389   uint64_t w16 = util::SafeLoadAs<uint64_t>(in);
3390   w16 = arrow::bit_util::FromLittleEndian(w16);
3391   in += 8;
3392   uint64_t w17 = util::SafeLoadAs<uint64_t>(in);
3393   w17 = arrow::bit_util::FromLittleEndian(w17);
3394   in += 8;
3395   uint64_t w18 = util::SafeLoadAs<uint64_t>(in);
3396   w18 = arrow::bit_util::FromLittleEndian(w18);
3397   in += 8;
3398   uint64_t w19 = util::SafeLoadAs<uint64_t>(in);
3399   w19 = arrow::bit_util::FromLittleEndian(w19);
3400   in += 8;
3401   uint64_t w20 = util::SafeLoadAs<uint64_t>(in);
3402   w20 = arrow::bit_util::FromLittleEndian(w20);
3403   in += 8;
3404   uint64_t w21 = util::SafeLoadAs<uint64_t>(in);
3405   w21 = arrow::bit_util::FromLittleEndian(w21);
3406   in += 8;
3407   uint64_t w22 = util::SafeLoadAs<uint64_t>(in);
3408   w22 = arrow::bit_util::FromLittleEndian(w22);
3409   in += 8;
3410   out[0] = (w0)&mask;
3411   out[1] = ((w0 >> 46) | (w1 << 18)) & mask;
3412   out[2] = ((w1 >> 28) | (w2 << 36)) & mask;
3413   out[3] = (w2 >> 10) & mask;
3414   out[4] = ((w2 >> 56) | (w3 << 8)) & mask;
3415   out[5] = ((w3 >> 38) | (w4 << 26)) & mask;
3416   out[6] = ((w4 >> 20) | (w5 << 44)) & mask;
3417   out[7] = (w5 >> 2) & mask;
3418   out[8] = ((w5 >> 48) | (w6 << 16)) & mask;
3419   out[9] = ((w6 >> 30) | (w7 << 34)) & mask;
3420   out[10] = (w7 >> 12) & mask;
3421   out[11] = ((w7 >> 58) | (w8 << 6)) & mask;
3422   out[12] = ((w8 >> 40) | (w9 << 24)) & mask;
3423   out[13] = ((w9 >> 22) | (w10 << 42)) & mask;
3424   out[14] = (w10 >> 4) & mask;
3425   out[15] = ((w10 >> 50) | (w11 << 14)) & mask;
3426   out[16] = ((w11 >> 32) | (w12 << 32)) & mask;
3427   out[17] = (w12 >> 14) & mask;
3428   out[18] = ((w12 >> 60) | (w13 << 4)) & mask;
3429   out[19] = ((w13 >> 42) | (w14 << 22)) & mask;
3430   out[20] = ((w14 >> 24) | (w15 << 40)) & mask;
3431   out[21] = (w15 >> 6) & mask;
3432   out[22] = ((w15 >> 52) | (w16 << 12)) & mask;
3433   out[23] = ((w16 >> 34) | (w17 << 30)) & mask;
3434   out[24] = (w17 >> 16) & mask;
3435   out[25] = ((w17 >> 62) | (w18 << 2)) & mask;
3436   out[26] = ((w18 >> 44) | (w19 << 20)) & mask;
3437   out[27] = ((w19 >> 26) | (w20 << 38)) & mask;
3438   out[28] = (w20 >> 8) & mask;
3439   out[29] = ((w20 >> 54) | (w21 << 10)) & mask;
3440   out[30] = ((w21 >> 36) | (w22 << 28)) & mask;
3441   out[31] = w22 >> 18;
3442 
3443   return in;
3444 }
3445 
3446 inline const uint8_t* unpack47_64(const uint8_t* in, uint64_t* out) {
3447   const uint64_t mask = 140737488355327ULL;
3448   uint64_t w0 = util::SafeLoadAs<uint64_t>(in);
3449   w0 = arrow::bit_util::FromLittleEndian(w0);
3450   in += 8;
3451   uint64_t w1 = util::SafeLoadAs<uint64_t>(in);
3452   w1 = arrow::bit_util::FromLittleEndian(w1);
3453   in += 8;
3454   uint64_t w2 = util::SafeLoadAs<uint64_t>(in);
3455   w2 = arrow::bit_util::FromLittleEndian(w2);
3456   in += 8;
3457   uint64_t w3 = util::SafeLoadAs<uint64_t>(in);
3458   w3 = arrow::bit_util::FromLittleEndian(w3);
3459   in += 8;
3460   uint64_t w4 = util::SafeLoadAs<uint64_t>(in);
3461   w4 = arrow::bit_util::FromLittleEndian(w4);
3462   in += 8;
3463   uint64_t w5 = util::SafeLoadAs<uint64_t>(in);
3464   w5 = arrow::bit_util::FromLittleEndian(w5);
3465   in += 8;
3466   uint64_t w6 = util::SafeLoadAs<uint64_t>(in);
3467   w6 = arrow::bit_util::FromLittleEndian(w6);
3468   in += 8;
3469   uint64_t w7 = util::SafeLoadAs<uint64_t>(in);
3470   w7 = arrow::bit_util::FromLittleEndian(w7);
3471   in += 8;
3472   uint64_t w8 = util::SafeLoadAs<uint64_t>(in);
3473   w8 = arrow::bit_util::FromLittleEndian(w8);
3474   in += 8;
3475   uint64_t w9 = util::SafeLoadAs<uint64_t>(in);
3476   w9 = arrow::bit_util::FromLittleEndian(w9);
3477   in += 8;
3478   uint64_t w10 = util::SafeLoadAs<uint64_t>(in);
3479   w10 = arrow::bit_util::FromLittleEndian(w10);
3480   in += 8;
3481   uint64_t w11 = util::SafeLoadAs<uint64_t>(in);
3482   w11 = arrow::bit_util::FromLittleEndian(w11);
3483   in += 8;
3484   uint64_t w12 = util::SafeLoadAs<uint64_t>(in);
3485   w12 = arrow::bit_util::FromLittleEndian(w12);
3486   in += 8;
3487   uint64_t w13 = util::SafeLoadAs<uint64_t>(in);
3488   w13 = arrow::bit_util::FromLittleEndian(w13);
3489   in += 8;
3490   uint64_t w14 = util::SafeLoadAs<uint64_t>(in);
3491   w14 = arrow::bit_util::FromLittleEndian(w14);
3492   in += 8;
3493   uint64_t w15 = util::SafeLoadAs<uint64_t>(in);
3494   w15 = arrow::bit_util::FromLittleEndian(w15);
3495   in += 8;
3496   uint64_t w16 = util::SafeLoadAs<uint64_t>(in);
3497   w16 = arrow::bit_util::FromLittleEndian(w16);
3498   in += 8;
3499   uint64_t w17 = util::SafeLoadAs<uint64_t>(in);
3500   w17 = arrow::bit_util::FromLittleEndian(w17);
3501   in += 8;
3502   uint64_t w18 = util::SafeLoadAs<uint64_t>(in);
3503   w18 = arrow::bit_util::FromLittleEndian(w18);
3504   in += 8;
3505   uint64_t w19 = util::SafeLoadAs<uint64_t>(in);
3506   w19 = arrow::bit_util::FromLittleEndian(w19);
3507   in += 8;
3508   uint64_t w20 = util::SafeLoadAs<uint64_t>(in);
3509   w20 = arrow::bit_util::FromLittleEndian(w20);
3510   in += 8;
3511   uint64_t w21 = util::SafeLoadAs<uint64_t>(in);
3512   w21 = arrow::bit_util::FromLittleEndian(w21);
3513   in += 8;
3514   uint64_t w22 = util::SafeLoadAs<uint64_t>(in);
3515   w22 = arrow::bit_util::FromLittleEndian(w22);
3516   in += 8;
3517   uint64_t w23 = util::SafeLoadAs<uint32_t>(in);
3518   w23 = arrow::bit_util::FromLittleEndian(w23);
3519   in += 4;
3520   out[0] = (w0)&mask;
3521   out[1] = ((w0 >> 47) | (w1 << 17)) & mask;
3522   out[2] = ((w1 >> 30) | (w2 << 34)) & mask;
3523   out[3] = (w2 >> 13) & mask;
3524   out[4] = ((w2 >> 60) | (w3 << 4)) & mask;
3525   out[5] = ((w3 >> 43) | (w4 << 21)) & mask;
3526   out[6] = ((w4 >> 26) | (w5 << 38)) & mask;
3527   out[7] = (w5 >> 9) & mask;
3528   out[8] = ((w5 >> 56) | (w6 << 8)) & mask;
3529   out[9] = ((w6 >> 39) | (w7 << 25)) & mask;
3530   out[10] = ((w7 >> 22) | (w8 << 42)) & mask;
3531   out[11] = (w8 >> 5) & mask;
3532   out[12] = ((w8 >> 52) | (w9 << 12)) & mask;
3533   out[13] = ((w9 >> 35) | (w10 << 29)) & mask;
3534   out[14] = ((w10 >> 18) | (w11 << 46)) & mask;
3535   out[15] = (w11 >> 1) & mask;
3536   out[16] = ((w11 >> 48) | (w12 << 16)) & mask;
3537   out[17] = ((w12 >> 31) | (w13 << 33)) & mask;
3538   out[18] = (w13 >> 14) & mask;
3539   out[19] = ((w13 >> 61) | (w14 << 3)) & mask;
3540   out[20] = ((w14 >> 44) | (w15 << 20)) & mask;
3541   out[21] = ((w15 >> 27) | (w16 << 37)) & mask;
3542   out[22] = (w16 >> 10) & mask;
3543   out[23] = ((w16 >> 57) | (w17 << 7)) & mask;
3544   out[24] = ((w17 >> 40) | (w18 << 24)) & mask;
3545   out[25] = ((w18 >> 23) | (w19 << 41)) & mask;
3546   out[26] = (w19 >> 6) & mask;
3547   out[27] = ((w19 >> 53) | (w20 << 11)) & mask;
3548   out[28] = ((w20 >> 36) | (w21 << 28)) & mask;
3549   out[29] = ((w21 >> 19) | (w22 << 45)) & mask;
3550   out[30] = (w22 >> 2) & mask;
3551   out[31] = ((w22 >> 49) | (w23 << 15)) & mask;
3552 
3553   return in;
3554 }
3555 
3556 inline const uint8_t* unpack48_64(const uint8_t* in, uint64_t* out) {
3557   const uint64_t mask = 281474976710655ULL;
3558   uint64_t w0 = util::SafeLoadAs<uint64_t>(in);
3559   w0 = arrow::bit_util::FromLittleEndian(w0);
3560   in += 8;
3561   uint64_t w1 = util::SafeLoadAs<uint64_t>(in);
3562   w1 = arrow::bit_util::FromLittleEndian(w1);
3563   in += 8;
3564   uint64_t w2 = util::SafeLoadAs<uint64_t>(in);
3565   w2 = arrow::bit_util::FromLittleEndian(w2);
3566   in += 8;
3567   uint64_t w3 = util::SafeLoadAs<uint64_t>(in);
3568   w3 = arrow::bit_util::FromLittleEndian(w3);
3569   in += 8;
3570   uint64_t w4 = util::SafeLoadAs<uint64_t>(in);
3571   w4 = arrow::bit_util::FromLittleEndian(w4);
3572   in += 8;
3573   uint64_t w5 = util::SafeLoadAs<uint64_t>(in);
3574   w5 = arrow::bit_util::FromLittleEndian(w5);
3575   in += 8;
3576   uint64_t w6 = util::SafeLoadAs<uint64_t>(in);
3577   w6 = arrow::bit_util::FromLittleEndian(w6);
3578   in += 8;
3579   uint64_t w7 = util::SafeLoadAs<uint64_t>(in);
3580   w7 = arrow::bit_util::FromLittleEndian(w7);
3581   in += 8;
3582   uint64_t w8 = util::SafeLoadAs<uint64_t>(in);
3583   w8 = arrow::bit_util::FromLittleEndian(w8);
3584   in += 8;
3585   uint64_t w9 = util::SafeLoadAs<uint64_t>(in);
3586   w9 = arrow::bit_util::FromLittleEndian(w9);
3587   in += 8;
3588   uint64_t w10 = util::SafeLoadAs<uint64_t>(in);
3589   w10 = arrow::bit_util::FromLittleEndian(w10);
3590   in += 8;
3591   uint64_t w11 = util::SafeLoadAs<uint64_t>(in);
3592   w11 = arrow::bit_util::FromLittleEndian(w11);
3593   in += 8;
3594   uint64_t w12 = util::SafeLoadAs<uint64_t>(in);
3595   w12 = arrow::bit_util::FromLittleEndian(w12);
3596   in += 8;
3597   uint64_t w13 = util::SafeLoadAs<uint64_t>(in);
3598   w13 = arrow::bit_util::FromLittleEndian(w13);
3599   in += 8;
3600   uint64_t w14 = util::SafeLoadAs<uint64_t>(in);
3601   w14 = arrow::bit_util::FromLittleEndian(w14);
3602   in += 8;
3603   uint64_t w15 = util::SafeLoadAs<uint64_t>(in);
3604   w15 = arrow::bit_util::FromLittleEndian(w15);
3605   in += 8;
3606   uint64_t w16 = util::SafeLoadAs<uint64_t>(in);
3607   w16 = arrow::bit_util::FromLittleEndian(w16);
3608   in += 8;
3609   uint64_t w17 = util::SafeLoadAs<uint64_t>(in);
3610   w17 = arrow::bit_util::FromLittleEndian(w17);
3611   in += 8;
3612   uint64_t w18 = util::SafeLoadAs<uint64_t>(in);
3613   w18 = arrow::bit_util::FromLittleEndian(w18);
3614   in += 8;
3615   uint64_t w19 = util::SafeLoadAs<uint64_t>(in);
3616   w19 = arrow::bit_util::FromLittleEndian(w19);
3617   in += 8;
3618   uint64_t w20 = util::SafeLoadAs<uint64_t>(in);
3619   w20 = arrow::bit_util::FromLittleEndian(w20);
3620   in += 8;
3621   uint64_t w21 = util::SafeLoadAs<uint64_t>(in);
3622   w21 = arrow::bit_util::FromLittleEndian(w21);
3623   in += 8;
3624   uint64_t w22 = util::SafeLoadAs<uint64_t>(in);
3625   w22 = arrow::bit_util::FromLittleEndian(w22);
3626   in += 8;
3627   uint64_t w23 = util::SafeLoadAs<uint64_t>(in);
3628   w23 = arrow::bit_util::FromLittleEndian(w23);
3629   in += 8;
3630   out[0] = (w0)&mask;
3631   out[1] = ((w0 >> 48) | (w1 << 16)) & mask;
3632   out[2] = ((w1 >> 32) | (w2 << 32)) & mask;
3633   out[3] = w2 >> 16;
3634   out[4] = (w3)&mask;
3635   out[5] = ((w3 >> 48) | (w4 << 16)) & mask;
3636   out[6] = ((w4 >> 32) | (w5 << 32)) & mask;
3637   out[7] = w5 >> 16;
3638   out[8] = (w6)&mask;
3639   out[9] = ((w6 >> 48) | (w7 << 16)) & mask;
3640   out[10] = ((w7 >> 32) | (w8 << 32)) & mask;
3641   out[11] = w8 >> 16;
3642   out[12] = (w9)&mask;
3643   out[13] = ((w9 >> 48) | (w10 << 16)) & mask;
3644   out[14] = ((w10 >> 32) | (w11 << 32)) & mask;
3645   out[15] = w11 >> 16;
3646   out[16] = (w12)&mask;
3647   out[17] = ((w12 >> 48) | (w13 << 16)) & mask;
3648   out[18] = ((w13 >> 32) | (w14 << 32)) & mask;
3649   out[19] = w14 >> 16;
3650   out[20] = (w15)&mask;
3651   out[21] = ((w15 >> 48) | (w16 << 16)) & mask;
3652   out[22] = ((w16 >> 32) | (w17 << 32)) & mask;
3653   out[23] = w17 >> 16;
3654   out[24] = (w18)&mask;
3655   out[25] = ((w18 >> 48) | (w19 << 16)) & mask;
3656   out[26] = ((w19 >> 32) | (w20 << 32)) & mask;
3657   out[27] = w20 >> 16;
3658   out[28] = (w21)&mask;
3659   out[29] = ((w21 >> 48) | (w22 << 16)) & mask;
3660   out[30] = ((w22 >> 32) | (w23 << 32)) & mask;
3661   out[31] = w23 >> 16;
3662 
3663   return in;
3664 }
3665 
3666 inline const uint8_t* unpack49_64(const uint8_t* in, uint64_t* out) {
3667   const uint64_t mask = 562949953421311ULL;
3668   uint64_t w0 = util::SafeLoadAs<uint64_t>(in);
3669   w0 = arrow::bit_util::FromLittleEndian(w0);
3670   in += 8;
3671   uint64_t w1 = util::SafeLoadAs<uint64_t>(in);
3672   w1 = arrow::bit_util::FromLittleEndian(w1);
3673   in += 8;
3674   uint64_t w2 = util::SafeLoadAs<uint64_t>(in);
3675   w2 = arrow::bit_util::FromLittleEndian(w2);
3676   in += 8;
3677   uint64_t w3 = util::SafeLoadAs<uint64_t>(in);
3678   w3 = arrow::bit_util::FromLittleEndian(w3);
3679   in += 8;
3680   uint64_t w4 = util::SafeLoadAs<uint64_t>(in);
3681   w4 = arrow::bit_util::FromLittleEndian(w4);
3682   in += 8;
3683   uint64_t w5 = util::SafeLoadAs<uint64_t>(in);
3684   w5 = arrow::bit_util::FromLittleEndian(w5);
3685   in += 8;
3686   uint64_t w6 = util::SafeLoadAs<uint64_t>(in);
3687   w6 = arrow::bit_util::FromLittleEndian(w6);
3688   in += 8;
3689   uint64_t w7 = util::SafeLoadAs<uint64_t>(in);
3690   w7 = arrow::bit_util::FromLittleEndian(w7);
3691   in += 8;
3692   uint64_t w8 = util::SafeLoadAs<uint64_t>(in);
3693   w8 = arrow::bit_util::FromLittleEndian(w8);
3694   in += 8;
3695   uint64_t w9 = util::SafeLoadAs<uint64_t>(in);
3696   w9 = arrow::bit_util::FromLittleEndian(w9);
3697   in += 8;
3698   uint64_t w10 = util::SafeLoadAs<uint64_t>(in);
3699   w10 = arrow::bit_util::FromLittleEndian(w10);
3700   in += 8;
3701   uint64_t w11 = util::SafeLoadAs<uint64_t>(in);
3702   w11 = arrow::bit_util::FromLittleEndian(w11);
3703   in += 8;
3704   uint64_t w12 = util::SafeLoadAs<uint64_t>(in);
3705   w12 = arrow::bit_util::FromLittleEndian(w12);
3706   in += 8;
3707   uint64_t w13 = util::SafeLoadAs<uint64_t>(in);
3708   w13 = arrow::bit_util::FromLittleEndian(w13);
3709   in += 8;
3710   uint64_t w14 = util::SafeLoadAs<uint64_t>(in);
3711   w14 = arrow::bit_util::FromLittleEndian(w14);
3712   in += 8;
3713   uint64_t w15 = util::SafeLoadAs<uint64_t>(in);
3714   w15 = arrow::bit_util::FromLittleEndian(w15);
3715   in += 8;
3716   uint64_t w16 = util::SafeLoadAs<uint64_t>(in);
3717   w16 = arrow::bit_util::FromLittleEndian(w16);
3718   in += 8;
3719   uint64_t w17 = util::SafeLoadAs<uint64_t>(in);
3720   w17 = arrow::bit_util::FromLittleEndian(w17);
3721   in += 8;
3722   uint64_t w18 = util::SafeLoadAs<uint64_t>(in);
3723   w18 = arrow::bit_util::FromLittleEndian(w18);
3724   in += 8;
3725   uint64_t w19 = util::SafeLoadAs<uint64_t>(in);
3726   w19 = arrow::bit_util::FromLittleEndian(w19);
3727   in += 8;
3728   uint64_t w20 = util::SafeLoadAs<uint64_t>(in);
3729   w20 = arrow::bit_util::FromLittleEndian(w20);
3730   in += 8;
3731   uint64_t w21 = util::SafeLoadAs<uint64_t>(in);
3732   w21 = arrow::bit_util::FromLittleEndian(w21);
3733   in += 8;
3734   uint64_t w22 = util::SafeLoadAs<uint64_t>(in);
3735   w22 = arrow::bit_util::FromLittleEndian(w22);
3736   in += 8;
3737   uint64_t w23 = util::SafeLoadAs<uint64_t>(in);
3738   w23 = arrow::bit_util::FromLittleEndian(w23);
3739   in += 8;
3740   uint64_t w24 = util::SafeLoadAs<uint32_t>(in);
3741   w24 = arrow::bit_util::FromLittleEndian(w24);
3742   in += 4;
3743   out[0] = (w0)&mask;
3744   out[1] = ((w0 >> 49) | (w1 << 15)) & mask;
3745   out[2] = ((w1 >> 34) | (w2 << 30)) & mask;
3746   out[3] = ((w2 >> 19) | (w3 << 45)) & mask;
3747   out[4] = (w3 >> 4) & mask;
3748   out[5] = ((w3 >> 53) | (w4 << 11)) & mask;
3749   out[6] = ((w4 >> 38) | (w5 << 26)) & mask;
3750   out[7] = ((w5 >> 23) | (w6 << 41)) & mask;
3751   out[8] = (w6 >> 8) & mask;
3752   out[9] = ((w6 >> 57) | (w7 << 7)) & mask;
3753   out[10] = ((w7 >> 42) | (w8 << 22)) & mask;
3754   out[11] = ((w8 >> 27) | (w9 << 37)) & mask;
3755   out[12] = (w9 >> 12) & mask;
3756   out[13] = ((w9 >> 61) | (w10 << 3)) & mask;
3757   out[14] = ((w10 >> 46) | (w11 << 18)) & mask;
3758   out[15] = ((w11 >> 31) | (w12 << 33)) & mask;
3759   out[16] = ((w12 >> 16) | (w13 << 48)) & mask;
3760   out[17] = (w13 >> 1) & mask;
3761   out[18] = ((w13 >> 50) | (w14 << 14)) & mask;
3762   out[19] = ((w14 >> 35) | (w15 << 29)) & mask;
3763   out[20] = ((w15 >> 20) | (w16 << 44)) & mask;
3764   out[21] = (w16 >> 5) & mask;
3765   out[22] = ((w16 >> 54) | (w17 << 10)) & mask;
3766   out[23] = ((w17 >> 39) | (w18 << 25)) & mask;
3767   out[24] = ((w18 >> 24) | (w19 << 40)) & mask;
3768   out[25] = (w19 >> 9) & mask;
3769   out[26] = ((w19 >> 58) | (w20 << 6)) & mask;
3770   out[27] = ((w20 >> 43) | (w21 << 21)) & mask;
3771   out[28] = ((w21 >> 28) | (w22 << 36)) & mask;
3772   out[29] = (w22 >> 13) & mask;
3773   out[30] = ((w22 >> 62) | (w23 << 2)) & mask;
3774   out[31] = ((w23 >> 47) | (w24 << 17)) & mask;
3775 
3776   return in;
3777 }
3778 
3779 inline const uint8_t* unpack50_64(const uint8_t* in, uint64_t* out) {
3780   const uint64_t mask = 1125899906842623ULL;
3781   uint64_t w0 = util::SafeLoadAs<uint64_t>(in);
3782   w0 = arrow::bit_util::FromLittleEndian(w0);
3783   in += 8;
3784   uint64_t w1 = util::SafeLoadAs<uint64_t>(in);
3785   w1 = arrow::bit_util::FromLittleEndian(w1);
3786   in += 8;
3787   uint64_t w2 = util::SafeLoadAs<uint64_t>(in);
3788   w2 = arrow::bit_util::FromLittleEndian(w2);
3789   in += 8;
3790   uint64_t w3 = util::SafeLoadAs<uint64_t>(in);
3791   w3 = arrow::bit_util::FromLittleEndian(w3);
3792   in += 8;
3793   uint64_t w4 = util::SafeLoadAs<uint64_t>(in);
3794   w4 = arrow::bit_util::FromLittleEndian(w4);
3795   in += 8;
3796   uint64_t w5 = util::SafeLoadAs<uint64_t>(in);
3797   w5 = arrow::bit_util::FromLittleEndian(w5);
3798   in += 8;
3799   uint64_t w6 = util::SafeLoadAs<uint64_t>(in);
3800   w6 = arrow::bit_util::FromLittleEndian(w6);
3801   in += 8;
3802   uint64_t w7 = util::SafeLoadAs<uint64_t>(in);
3803   w7 = arrow::bit_util::FromLittleEndian(w7);
3804   in += 8;
3805   uint64_t w8 = util::SafeLoadAs<uint64_t>(in);
3806   w8 = arrow::bit_util::FromLittleEndian(w8);
3807   in += 8;
3808   uint64_t w9 = util::SafeLoadAs<uint64_t>(in);
3809   w9 = arrow::bit_util::FromLittleEndian(w9);
3810   in += 8;
3811   uint64_t w10 = util::SafeLoadAs<uint64_t>(in);
3812   w10 = arrow::bit_util::FromLittleEndian(w10);
3813   in += 8;
3814   uint64_t w11 = util::SafeLoadAs<uint64_t>(in);
3815   w11 = arrow::bit_util::FromLittleEndian(w11);
3816   in += 8;
3817   uint64_t w12 = util::SafeLoadAs<uint64_t>(in);
3818   w12 = arrow::bit_util::FromLittleEndian(w12);
3819   in += 8;
3820   uint64_t w13 = util::SafeLoadAs<uint64_t>(in);
3821   w13 = arrow::bit_util::FromLittleEndian(w13);
3822   in += 8;
3823   uint64_t w14 = util::SafeLoadAs<uint64_t>(in);
3824   w14 = arrow::bit_util::FromLittleEndian(w14);
3825   in += 8;
3826   uint64_t w15 = util::SafeLoadAs<uint64_t>(in);
3827   w15 = arrow::bit_util::FromLittleEndian(w15);
3828   in += 8;
3829   uint64_t w16 = util::SafeLoadAs<uint64_t>(in);
3830   w16 = arrow::bit_util::FromLittleEndian(w16);
3831   in += 8;
3832   uint64_t w17 = util::SafeLoadAs<uint64_t>(in);
3833   w17 = arrow::bit_util::FromLittleEndian(w17);
3834   in += 8;
3835   uint64_t w18 = util::SafeLoadAs<uint64_t>(in);
3836   w18 = arrow::bit_util::FromLittleEndian(w18);
3837   in += 8;
3838   uint64_t w19 = util::SafeLoadAs<uint64_t>(in);
3839   w19 = arrow::bit_util::FromLittleEndian(w19);
3840   in += 8;
3841   uint64_t w20 = util::SafeLoadAs<uint64_t>(in);
3842   w20 = arrow::bit_util::FromLittleEndian(w20);
3843   in += 8;
3844   uint64_t w21 = util::SafeLoadAs<uint64_t>(in);
3845   w21 = arrow::bit_util::FromLittleEndian(w21);
3846   in += 8;
3847   uint64_t w22 = util::SafeLoadAs<uint64_t>(in);
3848   w22 = arrow::bit_util::FromLittleEndian(w22);
3849   in += 8;
3850   uint64_t w23 = util::SafeLoadAs<uint64_t>(in);
3851   w23 = arrow::bit_util::FromLittleEndian(w23);
3852   in += 8;
3853   uint64_t w24 = util::SafeLoadAs<uint64_t>(in);
3854   w24 = arrow::bit_util::FromLittleEndian(w24);
3855   in += 8;
3856   out[0] = (w0)&mask;
3857   out[1] = ((w0 >> 50) | (w1 << 14)) & mask;
3858   out[2] = ((w1 >> 36) | (w2 << 28)) & mask;
3859   out[3] = ((w2 >> 22) | (w3 << 42)) & mask;
3860   out[4] = (w3 >> 8) & mask;
3861   out[5] = ((w3 >> 58) | (w4 << 6)) & mask;
3862   out[6] = ((w4 >> 44) | (w5 << 20)) & mask;
3863   out[7] = ((w5 >> 30) | (w6 << 34)) & mask;
3864   out[8] = ((w6 >> 16) | (w7 << 48)) & mask;
3865   out[9] = (w7 >> 2) & mask;
3866   out[10] = ((w7 >> 52) | (w8 << 12)) & mask;
3867   out[11] = ((w8 >> 38) | (w9 << 26)) & mask;
3868   out[12] = ((w9 >> 24) | (w10 << 40)) & mask;
3869   out[13] = (w10 >> 10) & mask;
3870   out[14] = ((w10 >> 60) | (w11 << 4)) & mask;
3871   out[15] = ((w11 >> 46) | (w12 << 18)) & mask;
3872   out[16] = ((w12 >> 32) | (w13 << 32)) & mask;
3873   out[17] = ((w13 >> 18) | (w14 << 46)) & mask;
3874   out[18] = (w14 >> 4) & mask;
3875   out[19] = ((w14 >> 54) | (w15 << 10)) & mask;
3876   out[20] = ((w15 >> 40) | (w16 << 24)) & mask;
3877   out[21] = ((w16 >> 26) | (w17 << 38)) & mask;
3878   out[22] = (w17 >> 12) & mask;
3879   out[23] = ((w17 >> 62) | (w18 << 2)) & mask;
3880   out[24] = ((w18 >> 48) | (w19 << 16)) & mask;
3881   out[25] = ((w19 >> 34) | (w20 << 30)) & mask;
3882   out[26] = ((w20 >> 20) | (w21 << 44)) & mask;
3883   out[27] = (w21 >> 6) & mask;
3884   out[28] = ((w21 >> 56) | (w22 << 8)) & mask;
3885   out[29] = ((w22 >> 42) | (w23 << 22)) & mask;
3886   out[30] = ((w23 >> 28) | (w24 << 36)) & mask;
3887   out[31] = w24 >> 14;
3888 
3889   return in;
3890 }
3891 
3892 inline const uint8_t* unpack51_64(const uint8_t* in, uint64_t* out) {
3893   const uint64_t mask = 2251799813685247ULL;
3894   uint64_t w0 = util::SafeLoadAs<uint64_t>(in);
3895   w0 = arrow::bit_util::FromLittleEndian(w0);
3896   in += 8;
3897   uint64_t w1 = util::SafeLoadAs<uint64_t>(in);
3898   w1 = arrow::bit_util::FromLittleEndian(w1);
3899   in += 8;
3900   uint64_t w2 = util::SafeLoadAs<uint64_t>(in);
3901   w2 = arrow::bit_util::FromLittleEndian(w2);
3902   in += 8;
3903   uint64_t w3 = util::SafeLoadAs<uint64_t>(in);
3904   w3 = arrow::bit_util::FromLittleEndian(w3);
3905   in += 8;
3906   uint64_t w4 = util::SafeLoadAs<uint64_t>(in);
3907   w4 = arrow::bit_util::FromLittleEndian(w4);
3908   in += 8;
3909   uint64_t w5 = util::SafeLoadAs<uint64_t>(in);
3910   w5 = arrow::bit_util::FromLittleEndian(w5);
3911   in += 8;
3912   uint64_t w6 = util::SafeLoadAs<uint64_t>(in);
3913   w6 = arrow::bit_util::FromLittleEndian(w6);
3914   in += 8;
3915   uint64_t w7 = util::SafeLoadAs<uint64_t>(in);
3916   w7 = arrow::bit_util::FromLittleEndian(w7);
3917   in += 8;
3918   uint64_t w8 = util::SafeLoadAs<uint64_t>(in);
3919   w8 = arrow::bit_util::FromLittleEndian(w8);
3920   in += 8;
3921   uint64_t w9 = util::SafeLoadAs<uint64_t>(in);
3922   w9 = arrow::bit_util::FromLittleEndian(w9);
3923   in += 8;
3924   uint64_t w10 = util::SafeLoadAs<uint64_t>(in);
3925   w10 = arrow::bit_util::FromLittleEndian(w10);
3926   in += 8;
3927   uint64_t w11 = util::SafeLoadAs<uint64_t>(in);
3928   w11 = arrow::bit_util::FromLittleEndian(w11);
3929   in += 8;
3930   uint64_t w12 = util::SafeLoadAs<uint64_t>(in);
3931   w12 = arrow::bit_util::FromLittleEndian(w12);
3932   in += 8;
3933   uint64_t w13 = util::SafeLoadAs<uint64_t>(in);
3934   w13 = arrow::bit_util::FromLittleEndian(w13);
3935   in += 8;
3936   uint64_t w14 = util::SafeLoadAs<uint64_t>(in);
3937   w14 = arrow::bit_util::FromLittleEndian(w14);
3938   in += 8;
3939   uint64_t w15 = util::SafeLoadAs<uint64_t>(in);
3940   w15 = arrow::bit_util::FromLittleEndian(w15);
3941   in += 8;
3942   uint64_t w16 = util::SafeLoadAs<uint64_t>(in);
3943   w16 = arrow::bit_util::FromLittleEndian(w16);
3944   in += 8;
3945   uint64_t w17 = util::SafeLoadAs<uint64_t>(in);
3946   w17 = arrow::bit_util::FromLittleEndian(w17);
3947   in += 8;
3948   uint64_t w18 = util::SafeLoadAs<uint64_t>(in);
3949   w18 = arrow::bit_util::FromLittleEndian(w18);
3950   in += 8;
3951   uint64_t w19 = util::SafeLoadAs<uint64_t>(in);
3952   w19 = arrow::bit_util::FromLittleEndian(w19);
3953   in += 8;
3954   uint64_t w20 = util::SafeLoadAs<uint64_t>(in);
3955   w20 = arrow::bit_util::FromLittleEndian(w20);
3956   in += 8;
3957   uint64_t w21 = util::SafeLoadAs<uint64_t>(in);
3958   w21 = arrow::bit_util::FromLittleEndian(w21);
3959   in += 8;
3960   uint64_t w22 = util::SafeLoadAs<uint64_t>(in);
3961   w22 = arrow::bit_util::FromLittleEndian(w22);
3962   in += 8;
3963   uint64_t w23 = util::SafeLoadAs<uint64_t>(in);
3964   w23 = arrow::bit_util::FromLittleEndian(w23);
3965   in += 8;
3966   uint64_t w24 = util::SafeLoadAs<uint64_t>(in);
3967   w24 = arrow::bit_util::FromLittleEndian(w24);
3968   in += 8;
3969   uint64_t w25 = util::SafeLoadAs<uint32_t>(in);
3970   w25 = arrow::bit_util::FromLittleEndian(w25);
3971   in += 4;
3972   out[0] = (w0)&mask;
3973   out[1] = ((w0 >> 51) | (w1 << 13)) & mask;
3974   out[2] = ((w1 >> 38) | (w2 << 26)) & mask;
3975   out[3] = ((w2 >> 25) | (w3 << 39)) & mask;
3976   out[4] = (w3 >> 12) & mask;
3977   out[5] = ((w3 >> 63) | (w4 << 1)) & mask;
3978   out[6] = ((w4 >> 50) | (w5 << 14)) & mask;
3979   out[7] = ((w5 >> 37) | (w6 << 27)) & mask;
3980   out[8] = ((w6 >> 24) | (w7 << 40)) & mask;
3981   out[9] = (w7 >> 11) & mask;
3982   out[10] = ((w7 >> 62) | (w8 << 2)) & mask;
3983   out[11] = ((w8 >> 49) | (w9 << 15)) & mask;
3984   out[12] = ((w9 >> 36) | (w10 << 28)) & mask;
3985   out[13] = ((w10 >> 23) | (w11 << 41)) & mask;
3986   out[14] = (w11 >> 10) & mask;
3987   out[15] = ((w11 >> 61) | (w12 << 3)) & mask;
3988   out[16] = ((w12 >> 48) | (w13 << 16)) & mask;
3989   out[17] = ((w13 >> 35) | (w14 << 29)) & mask;
3990   out[18] = ((w14 >> 22) | (w15 << 42)) & mask;
3991   out[19] = (w15 >> 9) & mask;
3992   out[20] = ((w15 >> 60) | (w16 << 4)) & mask;
3993   out[21] = ((w16 >> 47) | (w17 << 17)) & mask;
3994   out[22] = ((w17 >> 34) | (w18 << 30)) & mask;
3995   out[23] = ((w18 >> 21) | (w19 << 43)) & mask;
3996   out[24] = (w19 >> 8) & mask;
3997   out[25] = ((w19 >> 59) | (w20 << 5)) & mask;
3998   out[26] = ((w20 >> 46) | (w21 << 18)) & mask;
3999   out[27] = ((w21 >> 33) | (w22 << 31)) & mask;
4000   out[28] = ((w22 >> 20) | (w23 << 44)) & mask;
4001   out[29] = (w23 >> 7) & mask;
4002   out[30] = ((w23 >> 58) | (w24 << 6)) & mask;
4003   out[31] = ((w24 >> 45) | (w25 << 19)) & mask;
4004 
4005   return in;
4006 }
4007 
4008 inline const uint8_t* unpack52_64(const uint8_t* in, uint64_t* out) {
4009   const uint64_t mask = 4503599627370495ULL;
4010   uint64_t w0 = util::SafeLoadAs<uint64_t>(in);
4011   w0 = arrow::bit_util::FromLittleEndian(w0);
4012   in += 8;
4013   uint64_t w1 = util::SafeLoadAs<uint64_t>(in);
4014   w1 = arrow::bit_util::FromLittleEndian(w1);
4015   in += 8;
4016   uint64_t w2 = util::SafeLoadAs<uint64_t>(in);
4017   w2 = arrow::bit_util::FromLittleEndian(w2);
4018   in += 8;
4019   uint64_t w3 = util::SafeLoadAs<uint64_t>(in);
4020   w3 = arrow::bit_util::FromLittleEndian(w3);
4021   in += 8;
4022   uint64_t w4 = util::SafeLoadAs<uint64_t>(in);
4023   w4 = arrow::bit_util::FromLittleEndian(w4);
4024   in += 8;
4025   uint64_t w5 = util::SafeLoadAs<uint64_t>(in);
4026   w5 = arrow::bit_util::FromLittleEndian(w5);
4027   in += 8;
4028   uint64_t w6 = util::SafeLoadAs<uint64_t>(in);
4029   w6 = arrow::bit_util::FromLittleEndian(w6);
4030   in += 8;
4031   uint64_t w7 = util::SafeLoadAs<uint64_t>(in);
4032   w7 = arrow::bit_util::FromLittleEndian(w7);
4033   in += 8;
4034   uint64_t w8 = util::SafeLoadAs<uint64_t>(in);
4035   w8 = arrow::bit_util::FromLittleEndian(w8);
4036   in += 8;
4037   uint64_t w9 = util::SafeLoadAs<uint64_t>(in);
4038   w9 = arrow::bit_util::FromLittleEndian(w9);
4039   in += 8;
4040   uint64_t w10 = util::SafeLoadAs<uint64_t>(in);
4041   w10 = arrow::bit_util::FromLittleEndian(w10);
4042   in += 8;
4043   uint64_t w11 = util::SafeLoadAs<uint64_t>(in);
4044   w11 = arrow::bit_util::FromLittleEndian(w11);
4045   in += 8;
4046   uint64_t w12 = util::SafeLoadAs<uint64_t>(in);
4047   w12 = arrow::bit_util::FromLittleEndian(w12);
4048   in += 8;
4049   uint64_t w13 = util::SafeLoadAs<uint64_t>(in);
4050   w13 = arrow::bit_util::FromLittleEndian(w13);
4051   in += 8;
4052   uint64_t w14 = util::SafeLoadAs<uint64_t>(in);
4053   w14 = arrow::bit_util::FromLittleEndian(w14);
4054   in += 8;
4055   uint64_t w15 = util::SafeLoadAs<uint64_t>(in);
4056   w15 = arrow::bit_util::FromLittleEndian(w15);
4057   in += 8;
4058   uint64_t w16 = util::SafeLoadAs<uint64_t>(in);
4059   w16 = arrow::bit_util::FromLittleEndian(w16);
4060   in += 8;
4061   uint64_t w17 = util::SafeLoadAs<uint64_t>(in);
4062   w17 = arrow::bit_util::FromLittleEndian(w17);
4063   in += 8;
4064   uint64_t w18 = util::SafeLoadAs<uint64_t>(in);
4065   w18 = arrow::bit_util::FromLittleEndian(w18);
4066   in += 8;
4067   uint64_t w19 = util::SafeLoadAs<uint64_t>(in);
4068   w19 = arrow::bit_util::FromLittleEndian(w19);
4069   in += 8;
4070   uint64_t w20 = util::SafeLoadAs<uint64_t>(in);
4071   w20 = arrow::bit_util::FromLittleEndian(w20);
4072   in += 8;
4073   uint64_t w21 = util::SafeLoadAs<uint64_t>(in);
4074   w21 = arrow::bit_util::FromLittleEndian(w21);
4075   in += 8;
4076   uint64_t w22 = util::SafeLoadAs<uint64_t>(in);
4077   w22 = arrow::bit_util::FromLittleEndian(w22);
4078   in += 8;
4079   uint64_t w23 = util::SafeLoadAs<uint64_t>(in);
4080   w23 = arrow::bit_util::FromLittleEndian(w23);
4081   in += 8;
4082   uint64_t w24 = util::SafeLoadAs<uint64_t>(in);
4083   w24 = arrow::bit_util::FromLittleEndian(w24);
4084   in += 8;
4085   uint64_t w25 = util::SafeLoadAs<uint64_t>(in);
4086   w25 = arrow::bit_util::FromLittleEndian(w25);
4087   in += 8;
4088   out[0] = (w0)&mask;
4089   out[1] = ((w0 >> 52) | (w1 << 12)) & mask;
4090   out[2] = ((w1 >> 40) | (w2 << 24)) & mask;
4091   out[3] = ((w2 >> 28) | (w3 << 36)) & mask;
4092   out[4] = ((w3 >> 16) | (w4 << 48)) & mask;
4093   out[5] = (w4 >> 4) & mask;
4094   out[6] = ((w4 >> 56) | (w5 << 8)) & mask;
4095   out[7] = ((w5 >> 44) | (w6 << 20)) & mask;
4096   out[8] = ((w6 >> 32) | (w7 << 32)) & mask;
4097   out[9] = ((w7 >> 20) | (w8 << 44)) & mask;
4098   out[10] = (w8 >> 8) & mask;
4099   out[11] = ((w8 >> 60) | (w9 << 4)) & mask;
4100   out[12] = ((w9 >> 48) | (w10 << 16)) & mask;
4101   out[13] = ((w10 >> 36) | (w11 << 28)) & mask;
4102   out[14] = ((w11 >> 24) | (w12 << 40)) & mask;
4103   out[15] = w12 >> 12;
4104   out[16] = (w13)&mask;
4105   out[17] = ((w13 >> 52) | (w14 << 12)) & mask;
4106   out[18] = ((w14 >> 40) | (w15 << 24)) & mask;
4107   out[19] = ((w15 >> 28) | (w16 << 36)) & mask;
4108   out[20] = ((w16 >> 16) | (w17 << 48)) & mask;
4109   out[21] = (w17 >> 4) & mask;
4110   out[22] = ((w17 >> 56) | (w18 << 8)) & mask;
4111   out[23] = ((w18 >> 44) | (w19 << 20)) & mask;
4112   out[24] = ((w19 >> 32) | (w20 << 32)) & mask;
4113   out[25] = ((w20 >> 20) | (w21 << 44)) & mask;
4114   out[26] = (w21 >> 8) & mask;
4115   out[27] = ((w21 >> 60) | (w22 << 4)) & mask;
4116   out[28] = ((w22 >> 48) | (w23 << 16)) & mask;
4117   out[29] = ((w23 >> 36) | (w24 << 28)) & mask;
4118   out[30] = ((w24 >> 24) | (w25 << 40)) & mask;
4119   out[31] = w25 >> 12;
4120 
4121   return in;
4122 }
4123 
4124 inline const uint8_t* unpack53_64(const uint8_t* in, uint64_t* out) {
4125   const uint64_t mask = 9007199254740991ULL;
4126   uint64_t w0 = util::SafeLoadAs<uint64_t>(in);
4127   w0 = arrow::bit_util::FromLittleEndian(w0);
4128   in += 8;
4129   uint64_t w1 = util::SafeLoadAs<uint64_t>(in);
4130   w1 = arrow::bit_util::FromLittleEndian(w1);
4131   in += 8;
4132   uint64_t w2 = util::SafeLoadAs<uint64_t>(in);
4133   w2 = arrow::bit_util::FromLittleEndian(w2);
4134   in += 8;
4135   uint64_t w3 = util::SafeLoadAs<uint64_t>(in);
4136   w3 = arrow::bit_util::FromLittleEndian(w3);
4137   in += 8;
4138   uint64_t w4 = util::SafeLoadAs<uint64_t>(in);
4139   w4 = arrow::bit_util::FromLittleEndian(w4);
4140   in += 8;
4141   uint64_t w5 = util::SafeLoadAs<uint64_t>(in);
4142   w5 = arrow::bit_util::FromLittleEndian(w5);
4143   in += 8;
4144   uint64_t w6 = util::SafeLoadAs<uint64_t>(in);
4145   w6 = arrow::bit_util::FromLittleEndian(w6);
4146   in += 8;
4147   uint64_t w7 = util::SafeLoadAs<uint64_t>(in);
4148   w7 = arrow::bit_util::FromLittleEndian(w7);
4149   in += 8;
4150   uint64_t w8 = util::SafeLoadAs<uint64_t>(in);
4151   w8 = arrow::bit_util::FromLittleEndian(w8);
4152   in += 8;
4153   uint64_t w9 = util::SafeLoadAs<uint64_t>(in);
4154   w9 = arrow::bit_util::FromLittleEndian(w9);
4155   in += 8;
4156   uint64_t w10 = util::SafeLoadAs<uint64_t>(in);
4157   w10 = arrow::bit_util::FromLittleEndian(w10);
4158   in += 8;
4159   uint64_t w11 = util::SafeLoadAs<uint64_t>(in);
4160   w11 = arrow::bit_util::FromLittleEndian(w11);
4161   in += 8;
4162   uint64_t w12 = util::SafeLoadAs<uint64_t>(in);
4163   w12 = arrow::bit_util::FromLittleEndian(w12);
4164   in += 8;
4165   uint64_t w13 = util::SafeLoadAs<uint64_t>(in);
4166   w13 = arrow::bit_util::FromLittleEndian(w13);
4167   in += 8;
4168   uint64_t w14 = util::SafeLoadAs<uint64_t>(in);
4169   w14 = arrow::bit_util::FromLittleEndian(w14);
4170   in += 8;
4171   uint64_t w15 = util::SafeLoadAs<uint64_t>(in);
4172   w15 = arrow::bit_util::FromLittleEndian(w15);
4173   in += 8;
4174   uint64_t w16 = util::SafeLoadAs<uint64_t>(in);
4175   w16 = arrow::bit_util::FromLittleEndian(w16);
4176   in += 8;
4177   uint64_t w17 = util::SafeLoadAs<uint64_t>(in);
4178   w17 = arrow::bit_util::FromLittleEndian(w17);
4179   in += 8;
4180   uint64_t w18 = util::SafeLoadAs<uint64_t>(in);
4181   w18 = arrow::bit_util::FromLittleEndian(w18);
4182   in += 8;
4183   uint64_t w19 = util::SafeLoadAs<uint64_t>(in);
4184   w19 = arrow::bit_util::FromLittleEndian(w19);
4185   in += 8;
4186   uint64_t w20 = util::SafeLoadAs<uint64_t>(in);
4187   w20 = arrow::bit_util::FromLittleEndian(w20);
4188   in += 8;
4189   uint64_t w21 = util::SafeLoadAs<uint64_t>(in);
4190   w21 = arrow::bit_util::FromLittleEndian(w21);
4191   in += 8;
4192   uint64_t w22 = util::SafeLoadAs<uint64_t>(in);
4193   w22 = arrow::bit_util::FromLittleEndian(w22);
4194   in += 8;
4195   uint64_t w23 = util::SafeLoadAs<uint64_t>(in);
4196   w23 = arrow::bit_util::FromLittleEndian(w23);
4197   in += 8;
4198   uint64_t w24 = util::SafeLoadAs<uint64_t>(in);
4199   w24 = arrow::bit_util::FromLittleEndian(w24);
4200   in += 8;
4201   uint64_t w25 = util::SafeLoadAs<uint64_t>(in);
4202   w25 = arrow::bit_util::FromLittleEndian(w25);
4203   in += 8;
4204   uint64_t w26 = util::SafeLoadAs<uint32_t>(in);
4205   w26 = arrow::bit_util::FromLittleEndian(w26);
4206   in += 4;
4207   out[0] = (w0)&mask;
4208   out[1] = ((w0 >> 53) | (w1 << 11)) & mask;
4209   out[2] = ((w1 >> 42) | (w2 << 22)) & mask;
4210   out[3] = ((w2 >> 31) | (w3 << 33)) & mask;
4211   out[4] = ((w3 >> 20) | (w4 << 44)) & mask;
4212   out[5] = (w4 >> 9) & mask;
4213   out[6] = ((w4 >> 62) | (w5 << 2)) & mask;
4214   out[7] = ((w5 >> 51) | (w6 << 13)) & mask;
4215   out[8] = ((w6 >> 40) | (w7 << 24)) & mask;
4216   out[9] = ((w7 >> 29) | (w8 << 35)) & mask;
4217   out[10] = ((w8 >> 18) | (w9 << 46)) & mask;
4218   out[11] = (w9 >> 7) & mask;
4219   out[12] = ((w9 >> 60) | (w10 << 4)) & mask;
4220   out[13] = ((w10 >> 49) | (w11 << 15)) & mask;
4221   out[14] = ((w11 >> 38) | (w12 << 26)) & mask;
4222   out[15] = ((w12 >> 27) | (w13 << 37)) & mask;
4223   out[16] = ((w13 >> 16) | (w14 << 48)) & mask;
4224   out[17] = (w14 >> 5) & mask;
4225   out[18] = ((w14 >> 58) | (w15 << 6)) & mask;
4226   out[19] = ((w15 >> 47) | (w16 << 17)) & mask;
4227   out[20] = ((w16 >> 36) | (w17 << 28)) & mask;
4228   out[21] = ((w17 >> 25) | (w18 << 39)) & mask;
4229   out[22] = ((w18 >> 14) | (w19 << 50)) & mask;
4230   out[23] = (w19 >> 3) & mask;
4231   out[24] = ((w19 >> 56) | (w20 << 8)) & mask;
4232   out[25] = ((w20 >> 45) | (w21 << 19)) & mask;
4233   out[26] = ((w21 >> 34) | (w22 << 30)) & mask;
4234   out[27] = ((w22 >> 23) | (w23 << 41)) & mask;
4235   out[28] = ((w23 >> 12) | (w24 << 52)) & mask;
4236   out[29] = (w24 >> 1) & mask;
4237   out[30] = ((w24 >> 54) | (w25 << 10)) & mask;
4238   out[31] = ((w25 >> 43) | (w26 << 21)) & mask;
4239 
4240   return in;
4241 }
4242 
4243 inline const uint8_t* unpack54_64(const uint8_t* in, uint64_t* out) {
4244   const uint64_t mask = 18014398509481983ULL;
4245   uint64_t w0 = util::SafeLoadAs<uint64_t>(in);
4246   w0 = arrow::bit_util::FromLittleEndian(w0);
4247   in += 8;
4248   uint64_t w1 = util::SafeLoadAs<uint64_t>(in);
4249   w1 = arrow::bit_util::FromLittleEndian(w1);
4250   in += 8;
4251   uint64_t w2 = util::SafeLoadAs<uint64_t>(in);
4252   w2 = arrow::bit_util::FromLittleEndian(w2);
4253   in += 8;
4254   uint64_t w3 = util::SafeLoadAs<uint64_t>(in);
4255   w3 = arrow::bit_util::FromLittleEndian(w3);
4256   in += 8;
4257   uint64_t w4 = util::SafeLoadAs<uint64_t>(in);
4258   w4 = arrow::bit_util::FromLittleEndian(w4);
4259   in += 8;
4260   uint64_t w5 = util::SafeLoadAs<uint64_t>(in);
4261   w5 = arrow::bit_util::FromLittleEndian(w5);
4262   in += 8;
4263   uint64_t w6 = util::SafeLoadAs<uint64_t>(in);
4264   w6 = arrow::bit_util::FromLittleEndian(w6);
4265   in += 8;
4266   uint64_t w7 = util::SafeLoadAs<uint64_t>(in);
4267   w7 = arrow::bit_util::FromLittleEndian(w7);
4268   in += 8;
4269   uint64_t w8 = util::SafeLoadAs<uint64_t>(in);
4270   w8 = arrow::bit_util::FromLittleEndian(w8);
4271   in += 8;
4272   uint64_t w9 = util::SafeLoadAs<uint64_t>(in);
4273   w9 = arrow::bit_util::FromLittleEndian(w9);
4274   in += 8;
4275   uint64_t w10 = util::SafeLoadAs<uint64_t>(in);
4276   w10 = arrow::bit_util::FromLittleEndian(w10);
4277   in += 8;
4278   uint64_t w11 = util::SafeLoadAs<uint64_t>(in);
4279   w11 = arrow::bit_util::FromLittleEndian(w11);
4280   in += 8;
4281   uint64_t w12 = util::SafeLoadAs<uint64_t>(in);
4282   w12 = arrow::bit_util::FromLittleEndian(w12);
4283   in += 8;
4284   uint64_t w13 = util::SafeLoadAs<uint64_t>(in);
4285   w13 = arrow::bit_util::FromLittleEndian(w13);
4286   in += 8;
4287   uint64_t w14 = util::SafeLoadAs<uint64_t>(in);
4288   w14 = arrow::bit_util::FromLittleEndian(w14);
4289   in += 8;
4290   uint64_t w15 = util::SafeLoadAs<uint64_t>(in);
4291   w15 = arrow::bit_util::FromLittleEndian(w15);
4292   in += 8;
4293   uint64_t w16 = util::SafeLoadAs<uint64_t>(in);
4294   w16 = arrow::bit_util::FromLittleEndian(w16);
4295   in += 8;
4296   uint64_t w17 = util::SafeLoadAs<uint64_t>(in);
4297   w17 = arrow::bit_util::FromLittleEndian(w17);
4298   in += 8;
4299   uint64_t w18 = util::SafeLoadAs<uint64_t>(in);
4300   w18 = arrow::bit_util::FromLittleEndian(w18);
4301   in += 8;
4302   uint64_t w19 = util::SafeLoadAs<uint64_t>(in);
4303   w19 = arrow::bit_util::FromLittleEndian(w19);
4304   in += 8;
4305   uint64_t w20 = util::SafeLoadAs<uint64_t>(in);
4306   w20 = arrow::bit_util::FromLittleEndian(w20);
4307   in += 8;
4308   uint64_t w21 = util::SafeLoadAs<uint64_t>(in);
4309   w21 = arrow::bit_util::FromLittleEndian(w21);
4310   in += 8;
4311   uint64_t w22 = util::SafeLoadAs<uint64_t>(in);
4312   w22 = arrow::bit_util::FromLittleEndian(w22);
4313   in += 8;
4314   uint64_t w23 = util::SafeLoadAs<uint64_t>(in);
4315   w23 = arrow::bit_util::FromLittleEndian(w23);
4316   in += 8;
4317   uint64_t w24 = util::SafeLoadAs<uint64_t>(in);
4318   w24 = arrow::bit_util::FromLittleEndian(w24);
4319   in += 8;
4320   uint64_t w25 = util::SafeLoadAs<uint64_t>(in);
4321   w25 = arrow::bit_util::FromLittleEndian(w25);
4322   in += 8;
4323   uint64_t w26 = util::SafeLoadAs<uint64_t>(in);
4324   w26 = arrow::bit_util::FromLittleEndian(w26);
4325   in += 8;
4326   out[0] = (w0)&mask;
4327   out[1] = ((w0 >> 54) | (w1 << 10)) & mask;
4328   out[2] = ((w1 >> 44) | (w2 << 20)) & mask;
4329   out[3] = ((w2 >> 34) | (w3 << 30)) & mask;
4330   out[4] = ((w3 >> 24) | (w4 << 40)) & mask;
4331   out[5] = ((w4 >> 14) | (w5 << 50)) & mask;
4332   out[6] = (w5 >> 4) & mask;
4333   out[7] = ((w5 >> 58) | (w6 << 6)) & mask;
4334   out[8] = ((w6 >> 48) | (w7 << 16)) & mask;
4335   out[9] = ((w7 >> 38) | (w8 << 26)) & mask;
4336   out[10] = ((w8 >> 28) | (w9 << 36)) & mask;
4337   out[11] = ((w9 >> 18) | (w10 << 46)) & mask;
4338   out[12] = (w10 >> 8) & mask;
4339   out[13] = ((w10 >> 62) | (w11 << 2)) & mask;
4340   out[14] = ((w11 >> 52) | (w12 << 12)) & mask;
4341   out[15] = ((w12 >> 42) | (w13 << 22)) & mask;
4342   out[16] = ((w13 >> 32) | (w14 << 32)) & mask;
4343   out[17] = ((w14 >> 22) | (w15 << 42)) & mask;
4344   out[18] = ((w15 >> 12) | (w16 << 52)) & mask;
4345   out[19] = (w16 >> 2) & mask;
4346   out[20] = ((w16 >> 56) | (w17 << 8)) & mask;
4347   out[21] = ((w17 >> 46) | (w18 << 18)) & mask;
4348   out[22] = ((w18 >> 36) | (w19 << 28)) & mask;
4349   out[23] = ((w19 >> 26) | (w20 << 38)) & mask;
4350   out[24] = ((w20 >> 16) | (w21 << 48)) & mask;
4351   out[25] = (w21 >> 6) & mask;
4352   out[26] = ((w21 >> 60) | (w22 << 4)) & mask;
4353   out[27] = ((w22 >> 50) | (w23 << 14)) & mask;
4354   out[28] = ((w23 >> 40) | (w24 << 24)) & mask;
4355   out[29] = ((w24 >> 30) | (w25 << 34)) & mask;
4356   out[30] = ((w25 >> 20) | (w26 << 44)) & mask;
4357   out[31] = w26 >> 10;
4358 
4359   return in;
4360 }
4361 
4362 inline const uint8_t* unpack55_64(const uint8_t* in, uint64_t* out) {
4363   const uint64_t mask = 36028797018963967ULL;
4364   uint64_t w0 = util::SafeLoadAs<uint64_t>(in);
4365   w0 = arrow::bit_util::FromLittleEndian(w0);
4366   in += 8;
4367   uint64_t w1 = util::SafeLoadAs<uint64_t>(in);
4368   w1 = arrow::bit_util::FromLittleEndian(w1);
4369   in += 8;
4370   uint64_t w2 = util::SafeLoadAs<uint64_t>(in);
4371   w2 = arrow::bit_util::FromLittleEndian(w2);
4372   in += 8;
4373   uint64_t w3 = util::SafeLoadAs<uint64_t>(in);
4374   w3 = arrow::bit_util::FromLittleEndian(w3);
4375   in += 8;
4376   uint64_t w4 = util::SafeLoadAs<uint64_t>(in);
4377   w4 = arrow::bit_util::FromLittleEndian(w4);
4378   in += 8;
4379   uint64_t w5 = util::SafeLoadAs<uint64_t>(in);
4380   w5 = arrow::bit_util::FromLittleEndian(w5);
4381   in += 8;
4382   uint64_t w6 = util::SafeLoadAs<uint64_t>(in);
4383   w6 = arrow::bit_util::FromLittleEndian(w6);
4384   in += 8;
4385   uint64_t w7 = util::SafeLoadAs<uint64_t>(in);
4386   w7 = arrow::bit_util::FromLittleEndian(w7);
4387   in += 8;
4388   uint64_t w8 = util::SafeLoadAs<uint64_t>(in);
4389   w8 = arrow::bit_util::FromLittleEndian(w8);
4390   in += 8;
4391   uint64_t w9 = util::SafeLoadAs<uint64_t>(in);
4392   w9 = arrow::bit_util::FromLittleEndian(w9);
4393   in += 8;
4394   uint64_t w10 = util::SafeLoadAs<uint64_t>(in);
4395   w10 = arrow::bit_util::FromLittleEndian(w10);
4396   in += 8;
4397   uint64_t w11 = util::SafeLoadAs<uint64_t>(in);
4398   w11 = arrow::bit_util::FromLittleEndian(w11);
4399   in += 8;
4400   uint64_t w12 = util::SafeLoadAs<uint64_t>(in);
4401   w12 = arrow::bit_util::FromLittleEndian(w12);
4402   in += 8;
4403   uint64_t w13 = util::SafeLoadAs<uint64_t>(in);
4404   w13 = arrow::bit_util::FromLittleEndian(w13);
4405   in += 8;
4406   uint64_t w14 = util::SafeLoadAs<uint64_t>(in);
4407   w14 = arrow::bit_util::FromLittleEndian(w14);
4408   in += 8;
4409   uint64_t w15 = util::SafeLoadAs<uint64_t>(in);
4410   w15 = arrow::bit_util::FromLittleEndian(w15);
4411   in += 8;
4412   uint64_t w16 = util::SafeLoadAs<uint64_t>(in);
4413   w16 = arrow::bit_util::FromLittleEndian(w16);
4414   in += 8;
4415   uint64_t w17 = util::SafeLoadAs<uint64_t>(in);
4416   w17 = arrow::bit_util::FromLittleEndian(w17);
4417   in += 8;
4418   uint64_t w18 = util::SafeLoadAs<uint64_t>(in);
4419   w18 = arrow::bit_util::FromLittleEndian(w18);
4420   in += 8;
4421   uint64_t w19 = util::SafeLoadAs<uint64_t>(in);
4422   w19 = arrow::bit_util::FromLittleEndian(w19);
4423   in += 8;
4424   uint64_t w20 = util::SafeLoadAs<uint64_t>(in);
4425   w20 = arrow::bit_util::FromLittleEndian(w20);
4426   in += 8;
4427   uint64_t w21 = util::SafeLoadAs<uint64_t>(in);
4428   w21 = arrow::bit_util::FromLittleEndian(w21);
4429   in += 8;
4430   uint64_t w22 = util::SafeLoadAs<uint64_t>(in);
4431   w22 = arrow::bit_util::FromLittleEndian(w22);
4432   in += 8;
4433   uint64_t w23 = util::SafeLoadAs<uint64_t>(in);
4434   w23 = arrow::bit_util::FromLittleEndian(w23);
4435   in += 8;
4436   uint64_t w24 = util::SafeLoadAs<uint64_t>(in);
4437   w24 = arrow::bit_util::FromLittleEndian(w24);
4438   in += 8;
4439   uint64_t w25 = util::SafeLoadAs<uint64_t>(in);
4440   w25 = arrow::bit_util::FromLittleEndian(w25);
4441   in += 8;
4442   uint64_t w26 = util::SafeLoadAs<uint64_t>(in);
4443   w26 = arrow::bit_util::FromLittleEndian(w26);
4444   in += 8;
4445   uint64_t w27 = util::SafeLoadAs<uint32_t>(in);
4446   w27 = arrow::bit_util::FromLittleEndian(w27);
4447   in += 4;
4448   out[0] = (w0)&mask;
4449   out[1] = ((w0 >> 55) | (w1 << 9)) & mask;
4450   out[2] = ((w1 >> 46) | (w2 << 18)) & mask;
4451   out[3] = ((w2 >> 37) | (w3 << 27)) & mask;
4452   out[4] = ((w3 >> 28) | (w4 << 36)) & mask;
4453   out[5] = ((w4 >> 19) | (w5 << 45)) & mask;
4454   out[6] = ((w5 >> 10) | (w6 << 54)) & mask;
4455   out[7] = (w6 >> 1) & mask;
4456   out[8] = ((w6 >> 56) | (w7 << 8)) & mask;
4457   out[9] = ((w7 >> 47) | (w8 << 17)) & mask;
4458   out[10] = ((w8 >> 38) | (w9 << 26)) & mask;
4459   out[11] = ((w9 >> 29) | (w10 << 35)) & mask;
4460   out[12] = ((w10 >> 20) | (w11 << 44)) & mask;
4461   out[13] = ((w11 >> 11) | (w12 << 53)) & mask;
4462   out[14] = (w12 >> 2) & mask;
4463   out[15] = ((w12 >> 57) | (w13 << 7)) & mask;
4464   out[16] = ((w13 >> 48) | (w14 << 16)) & mask;
4465   out[17] = ((w14 >> 39) | (w15 << 25)) & mask;
4466   out[18] = ((w15 >> 30) | (w16 << 34)) & mask;
4467   out[19] = ((w16 >> 21) | (w17 << 43)) & mask;
4468   out[20] = ((w17 >> 12) | (w18 << 52)) & mask;
4469   out[21] = (w18 >> 3) & mask;
4470   out[22] = ((w18 >> 58) | (w19 << 6)) & mask;
4471   out[23] = ((w19 >> 49) | (w20 << 15)) & mask;
4472   out[24] = ((w20 >> 40) | (w21 << 24)) & mask;
4473   out[25] = ((w21 >> 31) | (w22 << 33)) & mask;
4474   out[26] = ((w22 >> 22) | (w23 << 42)) & mask;
4475   out[27] = ((w23 >> 13) | (w24 << 51)) & mask;
4476   out[28] = (w24 >> 4) & mask;
4477   out[29] = ((w24 >> 59) | (w25 << 5)) & mask;
4478   out[30] = ((w25 >> 50) | (w26 << 14)) & mask;
4479   out[31] = ((w26 >> 41) | (w27 << 23)) & mask;
4480 
4481   return in;
4482 }
4483 
4484 inline const uint8_t* unpack56_64(const uint8_t* in, uint64_t* out) {
4485   const uint64_t mask = 72057594037927935ULL;
4486   uint64_t w0 = util::SafeLoadAs<uint64_t>(in);
4487   w0 = arrow::bit_util::FromLittleEndian(w0);
4488   in += 8;
4489   uint64_t w1 = util::SafeLoadAs<uint64_t>(in);
4490   w1 = arrow::bit_util::FromLittleEndian(w1);
4491   in += 8;
4492   uint64_t w2 = util::SafeLoadAs<uint64_t>(in);
4493   w2 = arrow::bit_util::FromLittleEndian(w2);
4494   in += 8;
4495   uint64_t w3 = util::SafeLoadAs<uint64_t>(in);
4496   w3 = arrow::bit_util::FromLittleEndian(w3);
4497   in += 8;
4498   uint64_t w4 = util::SafeLoadAs<uint64_t>(in);
4499   w4 = arrow::bit_util::FromLittleEndian(w4);
4500   in += 8;
4501   uint64_t w5 = util::SafeLoadAs<uint64_t>(in);
4502   w5 = arrow::bit_util::FromLittleEndian(w5);
4503   in += 8;
4504   uint64_t w6 = util::SafeLoadAs<uint64_t>(in);
4505   w6 = arrow::bit_util::FromLittleEndian(w6);
4506   in += 8;
4507   uint64_t w7 = util::SafeLoadAs<uint64_t>(in);
4508   w7 = arrow::bit_util::FromLittleEndian(w7);
4509   in += 8;
4510   uint64_t w8 = util::SafeLoadAs<uint64_t>(in);
4511   w8 = arrow::bit_util::FromLittleEndian(w8);
4512   in += 8;
4513   uint64_t w9 = util::SafeLoadAs<uint64_t>(in);
4514   w9 = arrow::bit_util::FromLittleEndian(w9);
4515   in += 8;
4516   uint64_t w10 = util::SafeLoadAs<uint64_t>(in);
4517   w10 = arrow::bit_util::FromLittleEndian(w10);
4518   in += 8;
4519   uint64_t w11 = util::SafeLoadAs<uint64_t>(in);
4520   w11 = arrow::bit_util::FromLittleEndian(w11);
4521   in += 8;
4522   uint64_t w12 = util::SafeLoadAs<uint64_t>(in);
4523   w12 = arrow::bit_util::FromLittleEndian(w12);
4524   in += 8;
4525   uint64_t w13 = util::SafeLoadAs<uint64_t>(in);
4526   w13 = arrow::bit_util::FromLittleEndian(w13);
4527   in += 8;
4528   uint64_t w14 = util::SafeLoadAs<uint64_t>(in);
4529   w14 = arrow::bit_util::FromLittleEndian(w14);
4530   in += 8;
4531   uint64_t w15 = util::SafeLoadAs<uint64_t>(in);
4532   w15 = arrow::bit_util::FromLittleEndian(w15);
4533   in += 8;
4534   uint64_t w16 = util::SafeLoadAs<uint64_t>(in);
4535   w16 = arrow::bit_util::FromLittleEndian(w16);
4536   in += 8;
4537   uint64_t w17 = util::SafeLoadAs<uint64_t>(in);
4538   w17 = arrow::bit_util::FromLittleEndian(w17);
4539   in += 8;
4540   uint64_t w18 = util::SafeLoadAs<uint64_t>(in);
4541   w18 = arrow::bit_util::FromLittleEndian(w18);
4542   in += 8;
4543   uint64_t w19 = util::SafeLoadAs<uint64_t>(in);
4544   w19 = arrow::bit_util::FromLittleEndian(w19);
4545   in += 8;
4546   uint64_t w20 = util::SafeLoadAs<uint64_t>(in);
4547   w20 = arrow::bit_util::FromLittleEndian(w20);
4548   in += 8;
4549   uint64_t w21 = util::SafeLoadAs<uint64_t>(in);
4550   w21 = arrow::bit_util::FromLittleEndian(w21);
4551   in += 8;
4552   uint64_t w22 = util::SafeLoadAs<uint64_t>(in);
4553   w22 = arrow::bit_util::FromLittleEndian(w22);
4554   in += 8;
4555   uint64_t w23 = util::SafeLoadAs<uint64_t>(in);
4556   w23 = arrow::bit_util::FromLittleEndian(w23);
4557   in += 8;
4558   uint64_t w24 = util::SafeLoadAs<uint64_t>(in);
4559   w24 = arrow::bit_util::FromLittleEndian(w24);
4560   in += 8;
4561   uint64_t w25 = util::SafeLoadAs<uint64_t>(in);
4562   w25 = arrow::bit_util::FromLittleEndian(w25);
4563   in += 8;
4564   uint64_t w26 = util::SafeLoadAs<uint64_t>(in);
4565   w26 = arrow::bit_util::FromLittleEndian(w26);
4566   in += 8;
4567   uint64_t w27 = util::SafeLoadAs<uint64_t>(in);
4568   w27 = arrow::bit_util::FromLittleEndian(w27);
4569   in += 8;
4570   out[0] = (w0)&mask;
4571   out[1] = ((w0 >> 56) | (w1 << 8)) & mask;
4572   out[2] = ((w1 >> 48) | (w2 << 16)) & mask;
4573   out[3] = ((w2 >> 40) | (w3 << 24)) & mask;
4574   out[4] = ((w3 >> 32) | (w4 << 32)) & mask;
4575   out[5] = ((w4 >> 24) | (w5 << 40)) & mask;
4576   out[6] = ((w5 >> 16) | (w6 << 48)) & mask;
4577   out[7] = w6 >> 8;
4578   out[8] = (w7)&mask;
4579   out[9] = ((w7 >> 56) | (w8 << 8)) & mask;
4580   out[10] = ((w8 >> 48) | (w9 << 16)) & mask;
4581   out[11] = ((w9 >> 40) | (w10 << 24)) & mask;
4582   out[12] = ((w10 >> 32) | (w11 << 32)) & mask;
4583   out[13] = ((w11 >> 24) | (w12 << 40)) & mask;
4584   out[14] = ((w12 >> 16) | (w13 << 48)) & mask;
4585   out[15] = w13 >> 8;
4586   out[16] = (w14)&mask;
4587   out[17] = ((w14 >> 56) | (w15 << 8)) & mask;
4588   out[18] = ((w15 >> 48) | (w16 << 16)) & mask;
4589   out[19] = ((w16 >> 40) | (w17 << 24)) & mask;
4590   out[20] = ((w17 >> 32) | (w18 << 32)) & mask;
4591   out[21] = ((w18 >> 24) | (w19 << 40)) & mask;
4592   out[22] = ((w19 >> 16) | (w20 << 48)) & mask;
4593   out[23] = w20 >> 8;
4594   out[24] = (w21)&mask;
4595   out[25] = ((w21 >> 56) | (w22 << 8)) & mask;
4596   out[26] = ((w22 >> 48) | (w23 << 16)) & mask;
4597   out[27] = ((w23 >> 40) | (w24 << 24)) & mask;
4598   out[28] = ((w24 >> 32) | (w25 << 32)) & mask;
4599   out[29] = ((w25 >> 24) | (w26 << 40)) & mask;
4600   out[30] = ((w26 >> 16) | (w27 << 48)) & mask;
4601   out[31] = w27 >> 8;
4602 
4603   return in;
4604 }
4605 
4606 inline const uint8_t* unpack57_64(const uint8_t* in, uint64_t* out) {
4607   const uint64_t mask = 144115188075855871ULL;
4608   uint64_t w0 = util::SafeLoadAs<uint64_t>(in);
4609   w0 = arrow::bit_util::FromLittleEndian(w0);
4610   in += 8;
4611   uint64_t w1 = util::SafeLoadAs<uint64_t>(in);
4612   w1 = arrow::bit_util::FromLittleEndian(w1);
4613   in += 8;
4614   uint64_t w2 = util::SafeLoadAs<uint64_t>(in);
4615   w2 = arrow::bit_util::FromLittleEndian(w2);
4616   in += 8;
4617   uint64_t w3 = util::SafeLoadAs<uint64_t>(in);
4618   w3 = arrow::bit_util::FromLittleEndian(w3);
4619   in += 8;
4620   uint64_t w4 = util::SafeLoadAs<uint64_t>(in);
4621   w4 = arrow::bit_util::FromLittleEndian(w4);
4622   in += 8;
4623   uint64_t w5 = util::SafeLoadAs<uint64_t>(in);
4624   w5 = arrow::bit_util::FromLittleEndian(w5);
4625   in += 8;
4626   uint64_t w6 = util::SafeLoadAs<uint64_t>(in);
4627   w6 = arrow::bit_util::FromLittleEndian(w6);
4628   in += 8;
4629   uint64_t w7 = util::SafeLoadAs<uint64_t>(in);
4630   w7 = arrow::bit_util::FromLittleEndian(w7);
4631   in += 8;
4632   uint64_t w8 = util::SafeLoadAs<uint64_t>(in);
4633   w8 = arrow::bit_util::FromLittleEndian(w8);
4634   in += 8;
4635   uint64_t w9 = util::SafeLoadAs<uint64_t>(in);
4636   w9 = arrow::bit_util::FromLittleEndian(w9);
4637   in += 8;
4638   uint64_t w10 = util::SafeLoadAs<uint64_t>(in);
4639   w10 = arrow::bit_util::FromLittleEndian(w10);
4640   in += 8;
4641   uint64_t w11 = util::SafeLoadAs<uint64_t>(in);
4642   w11 = arrow::bit_util::FromLittleEndian(w11);
4643   in += 8;
4644   uint64_t w12 = util::SafeLoadAs<uint64_t>(in);
4645   w12 = arrow::bit_util::FromLittleEndian(w12);
4646   in += 8;
4647   uint64_t w13 = util::SafeLoadAs<uint64_t>(in);
4648   w13 = arrow::bit_util::FromLittleEndian(w13);
4649   in += 8;
4650   uint64_t w14 = util::SafeLoadAs<uint64_t>(in);
4651   w14 = arrow::bit_util::FromLittleEndian(w14);
4652   in += 8;
4653   uint64_t w15 = util::SafeLoadAs<uint64_t>(in);
4654   w15 = arrow::bit_util::FromLittleEndian(w15);
4655   in += 8;
4656   uint64_t w16 = util::SafeLoadAs<uint64_t>(in);
4657   w16 = arrow::bit_util::FromLittleEndian(w16);
4658   in += 8;
4659   uint64_t w17 = util::SafeLoadAs<uint64_t>(in);
4660   w17 = arrow::bit_util::FromLittleEndian(w17);
4661   in += 8;
4662   uint64_t w18 = util::SafeLoadAs<uint64_t>(in);
4663   w18 = arrow::bit_util::FromLittleEndian(w18);
4664   in += 8;
4665   uint64_t w19 = util::SafeLoadAs<uint64_t>(in);
4666   w19 = arrow::bit_util::FromLittleEndian(w19);
4667   in += 8;
4668   uint64_t w20 = util::SafeLoadAs<uint64_t>(in);
4669   w20 = arrow::bit_util::FromLittleEndian(w20);
4670   in += 8;
4671   uint64_t w21 = util::SafeLoadAs<uint64_t>(in);
4672   w21 = arrow::bit_util::FromLittleEndian(w21);
4673   in += 8;
4674   uint64_t w22 = util::SafeLoadAs<uint64_t>(in);
4675   w22 = arrow::bit_util::FromLittleEndian(w22);
4676   in += 8;
4677   uint64_t w23 = util::SafeLoadAs<uint64_t>(in);
4678   w23 = arrow::bit_util::FromLittleEndian(w23);
4679   in += 8;
4680   uint64_t w24 = util::SafeLoadAs<uint64_t>(in);
4681   w24 = arrow::bit_util::FromLittleEndian(w24);
4682   in += 8;
4683   uint64_t w25 = util::SafeLoadAs<uint64_t>(in);
4684   w25 = arrow::bit_util::FromLittleEndian(w25);
4685   in += 8;
4686   uint64_t w26 = util::SafeLoadAs<uint64_t>(in);
4687   w26 = arrow::bit_util::FromLittleEndian(w26);
4688   in += 8;
4689   uint64_t w27 = util::SafeLoadAs<uint64_t>(in);
4690   w27 = arrow::bit_util::FromLittleEndian(w27);
4691   in += 8;
4692   uint64_t w28 = util::SafeLoadAs<uint32_t>(in);
4693   w28 = arrow::bit_util::FromLittleEndian(w28);
4694   in += 4;
4695   out[0] = (w0)&mask;
4696   out[1] = ((w0 >> 57) | (w1 << 7)) & mask;
4697   out[2] = ((w1 >> 50) | (w2 << 14)) & mask;
4698   out[3] = ((w2 >> 43) | (w3 << 21)) & mask;
4699   out[4] = ((w3 >> 36) | (w4 << 28)) & mask;
4700   out[5] = ((w4 >> 29) | (w5 << 35)) & mask;
4701   out[6] = ((w5 >> 22) | (w6 << 42)) & mask;
4702   out[7] = ((w6 >> 15) | (w7 << 49)) & mask;
4703   out[8] = ((w7 >> 8) | (w8 << 56)) & mask;
4704   out[9] = (w8 >> 1) & mask;
4705   out[10] = ((w8 >> 58) | (w9 << 6)) & mask;
4706   out[11] = ((w9 >> 51) | (w10 << 13)) & mask;
4707   out[12] = ((w10 >> 44) | (w11 << 20)) & mask;
4708   out[13] = ((w11 >> 37) | (w12 << 27)) & mask;
4709   out[14] = ((w12 >> 30) | (w13 << 34)) & mask;
4710   out[15] = ((w13 >> 23) | (w14 << 41)) & mask;
4711   out[16] = ((w14 >> 16) | (w15 << 48)) & mask;
4712   out[17] = ((w15 >> 9) | (w16 << 55)) & mask;
4713   out[18] = (w16 >> 2) & mask;
4714   out[19] = ((w16 >> 59) | (w17 << 5)) & mask;
4715   out[20] = ((w17 >> 52) | (w18 << 12)) & mask;
4716   out[21] = ((w18 >> 45) | (w19 << 19)) & mask;
4717   out[22] = ((w19 >> 38) | (w20 << 26)) & mask;
4718   out[23] = ((w20 >> 31) | (w21 << 33)) & mask;
4719   out[24] = ((w21 >> 24) | (w22 << 40)) & mask;
4720   out[25] = ((w22 >> 17) | (w23 << 47)) & mask;
4721   out[26] = ((w23 >> 10) | (w24 << 54)) & mask;
4722   out[27] = (w24 >> 3) & mask;
4723   out[28] = ((w24 >> 60) | (w25 << 4)) & mask;
4724   out[29] = ((w25 >> 53) | (w26 << 11)) & mask;
4725   out[30] = ((w26 >> 46) | (w27 << 18)) & mask;
4726   out[31] = ((w27 >> 39) | (w28 << 25)) & mask;
4727 
4728   return in;
4729 }
4730 
4731 inline const uint8_t* unpack58_64(const uint8_t* in, uint64_t* out) {
4732   const uint64_t mask = 288230376151711743ULL;
4733   uint64_t w0 = util::SafeLoadAs<uint64_t>(in);
4734   w0 = arrow::bit_util::FromLittleEndian(w0);
4735   in += 8;
4736   uint64_t w1 = util::SafeLoadAs<uint64_t>(in);
4737   w1 = arrow::bit_util::FromLittleEndian(w1);
4738   in += 8;
4739   uint64_t w2 = util::SafeLoadAs<uint64_t>(in);
4740   w2 = arrow::bit_util::FromLittleEndian(w2);
4741   in += 8;
4742   uint64_t w3 = util::SafeLoadAs<uint64_t>(in);
4743   w3 = arrow::bit_util::FromLittleEndian(w3);
4744   in += 8;
4745   uint64_t w4 = util::SafeLoadAs<uint64_t>(in);
4746   w4 = arrow::bit_util::FromLittleEndian(w4);
4747   in += 8;
4748   uint64_t w5 = util::SafeLoadAs<uint64_t>(in);
4749   w5 = arrow::bit_util::FromLittleEndian(w5);
4750   in += 8;
4751   uint64_t w6 = util::SafeLoadAs<uint64_t>(in);
4752   w6 = arrow::bit_util::FromLittleEndian(w6);
4753   in += 8;
4754   uint64_t w7 = util::SafeLoadAs<uint64_t>(in);
4755   w7 = arrow::bit_util::FromLittleEndian(w7);
4756   in += 8;
4757   uint64_t w8 = util::SafeLoadAs<uint64_t>(in);
4758   w8 = arrow::bit_util::FromLittleEndian(w8);
4759   in += 8;
4760   uint64_t w9 = util::SafeLoadAs<uint64_t>(in);
4761   w9 = arrow::bit_util::FromLittleEndian(w9);
4762   in += 8;
4763   uint64_t w10 = util::SafeLoadAs<uint64_t>(in);
4764   w10 = arrow::bit_util::FromLittleEndian(w10);
4765   in += 8;
4766   uint64_t w11 = util::SafeLoadAs<uint64_t>(in);
4767   w11 = arrow::bit_util::FromLittleEndian(w11);
4768   in += 8;
4769   uint64_t w12 = util::SafeLoadAs<uint64_t>(in);
4770   w12 = arrow::bit_util::FromLittleEndian(w12);
4771   in += 8;
4772   uint64_t w13 = util::SafeLoadAs<uint64_t>(in);
4773   w13 = arrow::bit_util::FromLittleEndian(w13);
4774   in += 8;
4775   uint64_t w14 = util::SafeLoadAs<uint64_t>(in);
4776   w14 = arrow::bit_util::FromLittleEndian(w14);
4777   in += 8;
4778   uint64_t w15 = util::SafeLoadAs<uint64_t>(in);
4779   w15 = arrow::bit_util::FromLittleEndian(w15);
4780   in += 8;
4781   uint64_t w16 = util::SafeLoadAs<uint64_t>(in);
4782   w16 = arrow::bit_util::FromLittleEndian(w16);
4783   in += 8;
4784   uint64_t w17 = util::SafeLoadAs<uint64_t>(in);
4785   w17 = arrow::bit_util::FromLittleEndian(w17);
4786   in += 8;
4787   uint64_t w18 = util::SafeLoadAs<uint64_t>(in);
4788   w18 = arrow::bit_util::FromLittleEndian(w18);
4789   in += 8;
4790   uint64_t w19 = util::SafeLoadAs<uint64_t>(in);
4791   w19 = arrow::bit_util::FromLittleEndian(w19);
4792   in += 8;
4793   uint64_t w20 = util::SafeLoadAs<uint64_t>(in);
4794   w20 = arrow::bit_util::FromLittleEndian(w20);
4795   in += 8;
4796   uint64_t w21 = util::SafeLoadAs<uint64_t>(in);
4797   w21 = arrow::bit_util::FromLittleEndian(w21);
4798   in += 8;
4799   uint64_t w22 = util::SafeLoadAs<uint64_t>(in);
4800   w22 = arrow::bit_util::FromLittleEndian(w22);
4801   in += 8;
4802   uint64_t w23 = util::SafeLoadAs<uint64_t>(in);
4803   w23 = arrow::bit_util::FromLittleEndian(w23);
4804   in += 8;
4805   uint64_t w24 = util::SafeLoadAs<uint64_t>(in);
4806   w24 = arrow::bit_util::FromLittleEndian(w24);
4807   in += 8;
4808   uint64_t w25 = util::SafeLoadAs<uint64_t>(in);
4809   w25 = arrow::bit_util::FromLittleEndian(w25);
4810   in += 8;
4811   uint64_t w26 = util::SafeLoadAs<uint64_t>(in);
4812   w26 = arrow::bit_util::FromLittleEndian(w26);
4813   in += 8;
4814   uint64_t w27 = util::SafeLoadAs<uint64_t>(in);
4815   w27 = arrow::bit_util::FromLittleEndian(w27);
4816   in += 8;
4817   uint64_t w28 = util::SafeLoadAs<uint64_t>(in);
4818   w28 = arrow::bit_util::FromLittleEndian(w28);
4819   in += 8;
4820   out[0] = (w0)&mask;
4821   out[1] = ((w0 >> 58) | (w1 << 6)) & mask;
4822   out[2] = ((w1 >> 52) | (w2 << 12)) & mask;
4823   out[3] = ((w2 >> 46) | (w3 << 18)) & mask;
4824   out[4] = ((w3 >> 40) | (w4 << 24)) & mask;
4825   out[5] = ((w4 >> 34) | (w5 << 30)) & mask;
4826   out[6] = ((w5 >> 28) | (w6 << 36)) & mask;
4827   out[7] = ((w6 >> 22) | (w7 << 42)) & mask;
4828   out[8] = ((w7 >> 16) | (w8 << 48)) & mask;
4829   out[9] = ((w8 >> 10) | (w9 << 54)) & mask;
4830   out[10] = (w9 >> 4) & mask;
4831   out[11] = ((w9 >> 62) | (w10 << 2)) & mask;
4832   out[12] = ((w10 >> 56) | (w11 << 8)) & mask;
4833   out[13] = ((w11 >> 50) | (w12 << 14)) & mask;
4834   out[14] = ((w12 >> 44) | (w13 << 20)) & mask;
4835   out[15] = ((w13 >> 38) | (w14 << 26)) & mask;
4836   out[16] = ((w14 >> 32) | (w15 << 32)) & mask;
4837   out[17] = ((w15 >> 26) | (w16 << 38)) & mask;
4838   out[18] = ((w16 >> 20) | (w17 << 44)) & mask;
4839   out[19] = ((w17 >> 14) | (w18 << 50)) & mask;
4840   out[20] = ((w18 >> 8) | (w19 << 56)) & mask;
4841   out[21] = (w19 >> 2) & mask;
4842   out[22] = ((w19 >> 60) | (w20 << 4)) & mask;
4843   out[23] = ((w20 >> 54) | (w21 << 10)) & mask;
4844   out[24] = ((w21 >> 48) | (w22 << 16)) & mask;
4845   out[25] = ((w22 >> 42) | (w23 << 22)) & mask;
4846   out[26] = ((w23 >> 36) | (w24 << 28)) & mask;
4847   out[27] = ((w24 >> 30) | (w25 << 34)) & mask;
4848   out[28] = ((w25 >> 24) | (w26 << 40)) & mask;
4849   out[29] = ((w26 >> 18) | (w27 << 46)) & mask;
4850   out[30] = ((w27 >> 12) | (w28 << 52)) & mask;
4851   out[31] = w28 >> 6;
4852 
4853   return in;
4854 }
4855 
4856 inline const uint8_t* unpack59_64(const uint8_t* in, uint64_t* out) {
4857   const uint64_t mask = 576460752303423487ULL;
4858   uint64_t w0 = util::SafeLoadAs<uint64_t>(in);
4859   w0 = arrow::bit_util::FromLittleEndian(w0);
4860   in += 8;
4861   uint64_t w1 = util::SafeLoadAs<uint64_t>(in);
4862   w1 = arrow::bit_util::FromLittleEndian(w1);
4863   in += 8;
4864   uint64_t w2 = util::SafeLoadAs<uint64_t>(in);
4865   w2 = arrow::bit_util::FromLittleEndian(w2);
4866   in += 8;
4867   uint64_t w3 = util::SafeLoadAs<uint64_t>(in);
4868   w3 = arrow::bit_util::FromLittleEndian(w3);
4869   in += 8;
4870   uint64_t w4 = util::SafeLoadAs<uint64_t>(in);
4871   w4 = arrow::bit_util::FromLittleEndian(w4);
4872   in += 8;
4873   uint64_t w5 = util::SafeLoadAs<uint64_t>(in);
4874   w5 = arrow::bit_util::FromLittleEndian(w5);
4875   in += 8;
4876   uint64_t w6 = util::SafeLoadAs<uint64_t>(in);
4877   w6 = arrow::bit_util::FromLittleEndian(w6);
4878   in += 8;
4879   uint64_t w7 = util::SafeLoadAs<uint64_t>(in);
4880   w7 = arrow::bit_util::FromLittleEndian(w7);
4881   in += 8;
4882   uint64_t w8 = util::SafeLoadAs<uint64_t>(in);
4883   w8 = arrow::bit_util::FromLittleEndian(w8);
4884   in += 8;
4885   uint64_t w9 = util::SafeLoadAs<uint64_t>(in);
4886   w9 = arrow::bit_util::FromLittleEndian(w9);
4887   in += 8;
4888   uint64_t w10 = util::SafeLoadAs<uint64_t>(in);
4889   w10 = arrow::bit_util::FromLittleEndian(w10);
4890   in += 8;
4891   uint64_t w11 = util::SafeLoadAs<uint64_t>(in);
4892   w11 = arrow::bit_util::FromLittleEndian(w11);
4893   in += 8;
4894   uint64_t w12 = util::SafeLoadAs<uint64_t>(in);
4895   w12 = arrow::bit_util::FromLittleEndian(w12);
4896   in += 8;
4897   uint64_t w13 = util::SafeLoadAs<uint64_t>(in);
4898   w13 = arrow::bit_util::FromLittleEndian(w13);
4899   in += 8;
4900   uint64_t w14 = util::SafeLoadAs<uint64_t>(in);
4901   w14 = arrow::bit_util::FromLittleEndian(w14);
4902   in += 8;
4903   uint64_t w15 = util::SafeLoadAs<uint64_t>(in);
4904   w15 = arrow::bit_util::FromLittleEndian(w15);
4905   in += 8;
4906   uint64_t w16 = util::SafeLoadAs<uint64_t>(in);
4907   w16 = arrow::bit_util::FromLittleEndian(w16);
4908   in += 8;
4909   uint64_t w17 = util::SafeLoadAs<uint64_t>(in);
4910   w17 = arrow::bit_util::FromLittleEndian(w17);
4911   in += 8;
4912   uint64_t w18 = util::SafeLoadAs<uint64_t>(in);
4913   w18 = arrow::bit_util::FromLittleEndian(w18);
4914   in += 8;
4915   uint64_t w19 = util::SafeLoadAs<uint64_t>(in);
4916   w19 = arrow::bit_util::FromLittleEndian(w19);
4917   in += 8;
4918   uint64_t w20 = util::SafeLoadAs<uint64_t>(in);
4919   w20 = arrow::bit_util::FromLittleEndian(w20);
4920   in += 8;
4921   uint64_t w21 = util::SafeLoadAs<uint64_t>(in);
4922   w21 = arrow::bit_util::FromLittleEndian(w21);
4923   in += 8;
4924   uint64_t w22 = util::SafeLoadAs<uint64_t>(in);
4925   w22 = arrow::bit_util::FromLittleEndian(w22);
4926   in += 8;
4927   uint64_t w23 = util::SafeLoadAs<uint64_t>(in);
4928   w23 = arrow::bit_util::FromLittleEndian(w23);
4929   in += 8;
4930   uint64_t w24 = util::SafeLoadAs<uint64_t>(in);
4931   w24 = arrow::bit_util::FromLittleEndian(w24);
4932   in += 8;
4933   uint64_t w25 = util::SafeLoadAs<uint64_t>(in);
4934   w25 = arrow::bit_util::FromLittleEndian(w25);
4935   in += 8;
4936   uint64_t w26 = util::SafeLoadAs<uint64_t>(in);
4937   w26 = arrow::bit_util::FromLittleEndian(w26);
4938   in += 8;
4939   uint64_t w27 = util::SafeLoadAs<uint64_t>(in);
4940   w27 = arrow::bit_util::FromLittleEndian(w27);
4941   in += 8;
4942   uint64_t w28 = util::SafeLoadAs<uint64_t>(in);
4943   w28 = arrow::bit_util::FromLittleEndian(w28);
4944   in += 8;
4945   uint64_t w29 = util::SafeLoadAs<uint32_t>(in);
4946   w29 = arrow::bit_util::FromLittleEndian(w29);
4947   in += 4;
4948   out[0] = (w0)&mask;
4949   out[1] = ((w0 >> 59) | (w1 << 5)) & mask;
4950   out[2] = ((w1 >> 54) | (w2 << 10)) & mask;
4951   out[3] = ((w2 >> 49) | (w3 << 15)) & mask;
4952   out[4] = ((w3 >> 44) | (w4 << 20)) & mask;
4953   out[5] = ((w4 >> 39) | (w5 << 25)) & mask;
4954   out[6] = ((w5 >> 34) | (w6 << 30)) & mask;
4955   out[7] = ((w6 >> 29) | (w7 << 35)) & mask;
4956   out[8] = ((w7 >> 24) | (w8 << 40)) & mask;
4957   out[9] = ((w8 >> 19) | (w9 << 45)) & mask;
4958   out[10] = ((w9 >> 14) | (w10 << 50)) & mask;
4959   out[11] = ((w10 >> 9) | (w11 << 55)) & mask;
4960   out[12] = (w11 >> 4) & mask;
4961   out[13] = ((w11 >> 63) | (w12 << 1)) & mask;
4962   out[14] = ((w12 >> 58) | (w13 << 6)) & mask;
4963   out[15] = ((w13 >> 53) | (w14 << 11)) & mask;
4964   out[16] = ((w14 >> 48) | (w15 << 16)) & mask;
4965   out[17] = ((w15 >> 43) | (w16 << 21)) & mask;
4966   out[18] = ((w16 >> 38) | (w17 << 26)) & mask;
4967   out[19] = ((w17 >> 33) | (w18 << 31)) & mask;
4968   out[20] = ((w18 >> 28) | (w19 << 36)) & mask;
4969   out[21] = ((w19 >> 23) | (w20 << 41)) & mask;
4970   out[22] = ((w20 >> 18) | (w21 << 46)) & mask;
4971   out[23] = ((w21 >> 13) | (w22 << 51)) & mask;
4972   out[24] = ((w22 >> 8) | (w23 << 56)) & mask;
4973   out[25] = (w23 >> 3) & mask;
4974   out[26] = ((w23 >> 62) | (w24 << 2)) & mask;
4975   out[27] = ((w24 >> 57) | (w25 << 7)) & mask;
4976   out[28] = ((w25 >> 52) | (w26 << 12)) & mask;
4977   out[29] = ((w26 >> 47) | (w27 << 17)) & mask;
4978   out[30] = ((w27 >> 42) | (w28 << 22)) & mask;
4979   out[31] = ((w28 >> 37) | (w29 << 27)) & mask;
4980 
4981   return in;
4982 }
4983 
4984 inline const uint8_t* unpack60_64(const uint8_t* in, uint64_t* out) {
4985   const uint64_t mask = 1152921504606846975ULL;
4986   uint64_t w0 = util::SafeLoadAs<uint64_t>(in);
4987   w0 = arrow::bit_util::FromLittleEndian(w0);
4988   in += 8;
4989   uint64_t w1 = util::SafeLoadAs<uint64_t>(in);
4990   w1 = arrow::bit_util::FromLittleEndian(w1);
4991   in += 8;
4992   uint64_t w2 = util::SafeLoadAs<uint64_t>(in);
4993   w2 = arrow::bit_util::FromLittleEndian(w2);
4994   in += 8;
4995   uint64_t w3 = util::SafeLoadAs<uint64_t>(in);
4996   w3 = arrow::bit_util::FromLittleEndian(w3);
4997   in += 8;
4998   uint64_t w4 = util::SafeLoadAs<uint64_t>(in);
4999   w4 = arrow::bit_util::FromLittleEndian(w4);
5000   in += 8;
5001   uint64_t w5 = util::SafeLoadAs<uint64_t>(in);
5002   w5 = arrow::bit_util::FromLittleEndian(w5);
5003   in += 8;
5004   uint64_t w6 = util::SafeLoadAs<uint64_t>(in);
5005   w6 = arrow::bit_util::FromLittleEndian(w6);
5006   in += 8;
5007   uint64_t w7 = util::SafeLoadAs<uint64_t>(in);
5008   w7 = arrow::bit_util::FromLittleEndian(w7);
5009   in += 8;
5010   uint64_t w8 = util::SafeLoadAs<uint64_t>(in);
5011   w8 = arrow::bit_util::FromLittleEndian(w8);
5012   in += 8;
5013   uint64_t w9 = util::SafeLoadAs<uint64_t>(in);
5014   w9 = arrow::bit_util::FromLittleEndian(w9);
5015   in += 8;
5016   uint64_t w10 = util::SafeLoadAs<uint64_t>(in);
5017   w10 = arrow::bit_util::FromLittleEndian(w10);
5018   in += 8;
5019   uint64_t w11 = util::SafeLoadAs<uint64_t>(in);
5020   w11 = arrow::bit_util::FromLittleEndian(w11);
5021   in += 8;
5022   uint64_t w12 = util::SafeLoadAs<uint64_t>(in);
5023   w12 = arrow::bit_util::FromLittleEndian(w12);
5024   in += 8;
5025   uint64_t w13 = util::SafeLoadAs<uint64_t>(in);
5026   w13 = arrow::bit_util::FromLittleEndian(w13);
5027   in += 8;
5028   uint64_t w14 = util::SafeLoadAs<uint64_t>(in);
5029   w14 = arrow::bit_util::FromLittleEndian(w14);
5030   in += 8;
5031   uint64_t w15 = util::SafeLoadAs<uint64_t>(in);
5032   w15 = arrow::bit_util::FromLittleEndian(w15);
5033   in += 8;
5034   uint64_t w16 = util::SafeLoadAs<uint64_t>(in);
5035   w16 = arrow::bit_util::FromLittleEndian(w16);
5036   in += 8;
5037   uint64_t w17 = util::SafeLoadAs<uint64_t>(in);
5038   w17 = arrow::bit_util::FromLittleEndian(w17);
5039   in += 8;
5040   uint64_t w18 = util::SafeLoadAs<uint64_t>(in);
5041   w18 = arrow::bit_util::FromLittleEndian(w18);
5042   in += 8;
5043   uint64_t w19 = util::SafeLoadAs<uint64_t>(in);
5044   w19 = arrow::bit_util::FromLittleEndian(w19);
5045   in += 8;
5046   uint64_t w20 = util::SafeLoadAs<uint64_t>(in);
5047   w20 = arrow::bit_util::FromLittleEndian(w20);
5048   in += 8;
5049   uint64_t w21 = util::SafeLoadAs<uint64_t>(in);
5050   w21 = arrow::bit_util::FromLittleEndian(w21);
5051   in += 8;
5052   uint64_t w22 = util::SafeLoadAs<uint64_t>(in);
5053   w22 = arrow::bit_util::FromLittleEndian(w22);
5054   in += 8;
5055   uint64_t w23 = util::SafeLoadAs<uint64_t>(in);
5056   w23 = arrow::bit_util::FromLittleEndian(w23);
5057   in += 8;
5058   uint64_t w24 = util::SafeLoadAs<uint64_t>(in);
5059   w24 = arrow::bit_util::FromLittleEndian(w24);
5060   in += 8;
5061   uint64_t w25 = util::SafeLoadAs<uint64_t>(in);
5062   w25 = arrow::bit_util::FromLittleEndian(w25);
5063   in += 8;
5064   uint64_t w26 = util::SafeLoadAs<uint64_t>(in);
5065   w26 = arrow::bit_util::FromLittleEndian(w26);
5066   in += 8;
5067   uint64_t w27 = util::SafeLoadAs<uint64_t>(in);
5068   w27 = arrow::bit_util::FromLittleEndian(w27);
5069   in += 8;
5070   uint64_t w28 = util::SafeLoadAs<uint64_t>(in);
5071   w28 = arrow::bit_util::FromLittleEndian(w28);
5072   in += 8;
5073   uint64_t w29 = util::SafeLoadAs<uint64_t>(in);
5074   w29 = arrow::bit_util::FromLittleEndian(w29);
5075   in += 8;
5076   out[0] = (w0)&mask;
5077   out[1] = ((w0 >> 60) | (w1 << 4)) & mask;
5078   out[2] = ((w1 >> 56) | (w2 << 8)) & mask;
5079   out[3] = ((w2 >> 52) | (w3 << 12)) & mask;
5080   out[4] = ((w3 >> 48) | (w4 << 16)) & mask;
5081   out[5] = ((w4 >> 44) | (w5 << 20)) & mask;
5082   out[6] = ((w5 >> 40) | (w6 << 24)) & mask;
5083   out[7] = ((w6 >> 36) | (w7 << 28)) & mask;
5084   out[8] = ((w7 >> 32) | (w8 << 32)) & mask;
5085   out[9] = ((w8 >> 28) | (w9 << 36)) & mask;
5086   out[10] = ((w9 >> 24) | (w10 << 40)) & mask;
5087   out[11] = ((w10 >> 20) | (w11 << 44)) & mask;
5088   out[12] = ((w11 >> 16) | (w12 << 48)) & mask;
5089   out[13] = ((w12 >> 12) | (w13 << 52)) & mask;
5090   out[14] = ((w13 >> 8) | (w14 << 56)) & mask;
5091   out[15] = w14 >> 4;
5092   out[16] = (w15)&mask;
5093   out[17] = ((w15 >> 60) | (w16 << 4)) & mask;
5094   out[18] = ((w16 >> 56) | (w17 << 8)) & mask;
5095   out[19] = ((w17 >> 52) | (w18 << 12)) & mask;
5096   out[20] = ((w18 >> 48) | (w19 << 16)) & mask;
5097   out[21] = ((w19 >> 44) | (w20 << 20)) & mask;
5098   out[22] = ((w20 >> 40) | (w21 << 24)) & mask;
5099   out[23] = ((w21 >> 36) | (w22 << 28)) & mask;
5100   out[24] = ((w22 >> 32) | (w23 << 32)) & mask;
5101   out[25] = ((w23 >> 28) | (w24 << 36)) & mask;
5102   out[26] = ((w24 >> 24) | (w25 << 40)) & mask;
5103   out[27] = ((w25 >> 20) | (w26 << 44)) & mask;
5104   out[28] = ((w26 >> 16) | (w27 << 48)) & mask;
5105   out[29] = ((w27 >> 12) | (w28 << 52)) & mask;
5106   out[30] = ((w28 >> 8) | (w29 << 56)) & mask;
5107   out[31] = w29 >> 4;
5108 
5109   return in;
5110 }
5111 
5112 inline const uint8_t* unpack61_64(const uint8_t* in, uint64_t* out) {
5113   const uint64_t mask = 2305843009213693951ULL;
5114   uint64_t w0 = util::SafeLoadAs<uint64_t>(in);
5115   w0 = arrow::bit_util::FromLittleEndian(w0);
5116   in += 8;
5117   uint64_t w1 = util::SafeLoadAs<uint64_t>(in);
5118   w1 = arrow::bit_util::FromLittleEndian(w1);
5119   in += 8;
5120   uint64_t w2 = util::SafeLoadAs<uint64_t>(in);
5121   w2 = arrow::bit_util::FromLittleEndian(w2);
5122   in += 8;
5123   uint64_t w3 = util::SafeLoadAs<uint64_t>(in);
5124   w3 = arrow::bit_util::FromLittleEndian(w3);
5125   in += 8;
5126   uint64_t w4 = util::SafeLoadAs<uint64_t>(in);
5127   w4 = arrow::bit_util::FromLittleEndian(w4);
5128   in += 8;
5129   uint64_t w5 = util::SafeLoadAs<uint64_t>(in);
5130   w5 = arrow::bit_util::FromLittleEndian(w5);
5131   in += 8;
5132   uint64_t w6 = util::SafeLoadAs<uint64_t>(in);
5133   w6 = arrow::bit_util::FromLittleEndian(w6);
5134   in += 8;
5135   uint64_t w7 = util::SafeLoadAs<uint64_t>(in);
5136   w7 = arrow::bit_util::FromLittleEndian(w7);
5137   in += 8;
5138   uint64_t w8 = util::SafeLoadAs<uint64_t>(in);
5139   w8 = arrow::bit_util::FromLittleEndian(w8);
5140   in += 8;
5141   uint64_t w9 = util::SafeLoadAs<uint64_t>(in);
5142   w9 = arrow::bit_util::FromLittleEndian(w9);
5143   in += 8;
5144   uint64_t w10 = util::SafeLoadAs<uint64_t>(in);
5145   w10 = arrow::bit_util::FromLittleEndian(w10);
5146   in += 8;
5147   uint64_t w11 = util::SafeLoadAs<uint64_t>(in);
5148   w11 = arrow::bit_util::FromLittleEndian(w11);
5149   in += 8;
5150   uint64_t w12 = util::SafeLoadAs<uint64_t>(in);
5151   w12 = arrow::bit_util::FromLittleEndian(w12);
5152   in += 8;
5153   uint64_t w13 = util::SafeLoadAs<uint64_t>(in);
5154   w13 = arrow::bit_util::FromLittleEndian(w13);
5155   in += 8;
5156   uint64_t w14 = util::SafeLoadAs<uint64_t>(in);
5157   w14 = arrow::bit_util::FromLittleEndian(w14);
5158   in += 8;
5159   uint64_t w15 = util::SafeLoadAs<uint64_t>(in);
5160   w15 = arrow::bit_util::FromLittleEndian(w15);
5161   in += 8;
5162   uint64_t w16 = util::SafeLoadAs<uint64_t>(in);
5163   w16 = arrow::bit_util::FromLittleEndian(w16);
5164   in += 8;
5165   uint64_t w17 = util::SafeLoadAs<uint64_t>(in);
5166   w17 = arrow::bit_util::FromLittleEndian(w17);
5167   in += 8;
5168   uint64_t w18 = util::SafeLoadAs<uint64_t>(in);
5169   w18 = arrow::bit_util::FromLittleEndian(w18);
5170   in += 8;
5171   uint64_t w19 = util::SafeLoadAs<uint64_t>(in);
5172   w19 = arrow::bit_util::FromLittleEndian(w19);
5173   in += 8;
5174   uint64_t w20 = util::SafeLoadAs<uint64_t>(in);
5175   w20 = arrow::bit_util::FromLittleEndian(w20);
5176   in += 8;
5177   uint64_t w21 = util::SafeLoadAs<uint64_t>(in);
5178   w21 = arrow::bit_util::FromLittleEndian(w21);
5179   in += 8;
5180   uint64_t w22 = util::SafeLoadAs<uint64_t>(in);
5181   w22 = arrow::bit_util::FromLittleEndian(w22);
5182   in += 8;
5183   uint64_t w23 = util::SafeLoadAs<uint64_t>(in);
5184   w23 = arrow::bit_util::FromLittleEndian(w23);
5185   in += 8;
5186   uint64_t w24 = util::SafeLoadAs<uint64_t>(in);
5187   w24 = arrow::bit_util::FromLittleEndian(w24);
5188   in += 8;
5189   uint64_t w25 = util::SafeLoadAs<uint64_t>(in);
5190   w25 = arrow::bit_util::FromLittleEndian(w25);
5191   in += 8;
5192   uint64_t w26 = util::SafeLoadAs<uint64_t>(in);
5193   w26 = arrow::bit_util::FromLittleEndian(w26);
5194   in += 8;
5195   uint64_t w27 = util::SafeLoadAs<uint64_t>(in);
5196   w27 = arrow::bit_util::FromLittleEndian(w27);
5197   in += 8;
5198   uint64_t w28 = util::SafeLoadAs<uint64_t>(in);
5199   w28 = arrow::bit_util::FromLittleEndian(w28);
5200   in += 8;
5201   uint64_t w29 = util::SafeLoadAs<uint64_t>(in);
5202   w29 = arrow::bit_util::FromLittleEndian(w29);
5203   in += 8;
5204   uint64_t w30 = util::SafeLoadAs<uint32_t>(in);
5205   w30 = arrow::bit_util::FromLittleEndian(w30);
5206   in += 4;
5207   out[0] = (w0)&mask;
5208   out[1] = ((w0 >> 61) | (w1 << 3)) & mask;
5209   out[2] = ((w1 >> 58) | (w2 << 6)) & mask;
5210   out[3] = ((w2 >> 55) | (w3 << 9)) & mask;
5211   out[4] = ((w3 >> 52) | (w4 << 12)) & mask;
5212   out[5] = ((w4 >> 49) | (w5 << 15)) & mask;
5213   out[6] = ((w5 >> 46) | (w6 << 18)) & mask;
5214   out[7] = ((w6 >> 43) | (w7 << 21)) & mask;
5215   out[8] = ((w7 >> 40) | (w8 << 24)) & mask;
5216   out[9] = ((w8 >> 37) | (w9 << 27)) & mask;
5217   out[10] = ((w9 >> 34) | (w10 << 30)) & mask;
5218   out[11] = ((w10 >> 31) | (w11 << 33)) & mask;
5219   out[12] = ((w11 >> 28) | (w12 << 36)) & mask;
5220   out[13] = ((w12 >> 25) | (w13 << 39)) & mask;
5221   out[14] = ((w13 >> 22) | (w14 << 42)) & mask;
5222   out[15] = ((w14 >> 19) | (w15 << 45)) & mask;
5223   out[16] = ((w15 >> 16) | (w16 << 48)) & mask;
5224   out[17] = ((w16 >> 13) | (w17 << 51)) & mask;
5225   out[18] = ((w17 >> 10) | (w18 << 54)) & mask;
5226   out[19] = ((w18 >> 7) | (w19 << 57)) & mask;
5227   out[20] = ((w19 >> 4) | (w20 << 60)) & mask;
5228   out[21] = (w20 >> 1) & mask;
5229   out[22] = ((w20 >> 62) | (w21 << 2)) & mask;
5230   out[23] = ((w21 >> 59) | (w22 << 5)) & mask;
5231   out[24] = ((w22 >> 56) | (w23 << 8)) & mask;
5232   out[25] = ((w23 >> 53) | (w24 << 11)) & mask;
5233   out[26] = ((w24 >> 50) | (w25 << 14)) & mask;
5234   out[27] = ((w25 >> 47) | (w26 << 17)) & mask;
5235   out[28] = ((w26 >> 44) | (w27 << 20)) & mask;
5236   out[29] = ((w27 >> 41) | (w28 << 23)) & mask;
5237   out[30] = ((w28 >> 38) | (w29 << 26)) & mask;
5238   out[31] = ((w29 >> 35) | (w30 << 29)) & mask;
5239 
5240   return in;
5241 }
5242 
5243 inline const uint8_t* unpack62_64(const uint8_t* in, uint64_t* out) {
5244   const uint64_t mask = 4611686018427387903ULL;
5245   uint64_t w0 = util::SafeLoadAs<uint64_t>(in);
5246   w0 = arrow::bit_util::FromLittleEndian(w0);
5247   in += 8;
5248   uint64_t w1 = util::SafeLoadAs<uint64_t>(in);
5249   w1 = arrow::bit_util::FromLittleEndian(w1);
5250   in += 8;
5251   uint64_t w2 = util::SafeLoadAs<uint64_t>(in);
5252   w2 = arrow::bit_util::FromLittleEndian(w2);
5253   in += 8;
5254   uint64_t w3 = util::SafeLoadAs<uint64_t>(in);
5255   w3 = arrow::bit_util::FromLittleEndian(w3);
5256   in += 8;
5257   uint64_t w4 = util::SafeLoadAs<uint64_t>(in);
5258   w4 = arrow::bit_util::FromLittleEndian(w4);
5259   in += 8;
5260   uint64_t w5 = util::SafeLoadAs<uint64_t>(in);
5261   w5 = arrow::bit_util::FromLittleEndian(w5);
5262   in += 8;
5263   uint64_t w6 = util::SafeLoadAs<uint64_t>(in);
5264   w6 = arrow::bit_util::FromLittleEndian(w6);
5265   in += 8;
5266   uint64_t w7 = util::SafeLoadAs<uint64_t>(in);
5267   w7 = arrow::bit_util::FromLittleEndian(w7);
5268   in += 8;
5269   uint64_t w8 = util::SafeLoadAs<uint64_t>(in);
5270   w8 = arrow::bit_util::FromLittleEndian(w8);
5271   in += 8;
5272   uint64_t w9 = util::SafeLoadAs<uint64_t>(in);
5273   w9 = arrow::bit_util::FromLittleEndian(w9);
5274   in += 8;
5275   uint64_t w10 = util::SafeLoadAs<uint64_t>(in);
5276   w10 = arrow::bit_util::FromLittleEndian(w10);
5277   in += 8;
5278   uint64_t w11 = util::SafeLoadAs<uint64_t>(in);
5279   w11 = arrow::bit_util::FromLittleEndian(w11);
5280   in += 8;
5281   uint64_t w12 = util::SafeLoadAs<uint64_t>(in);
5282   w12 = arrow::bit_util::FromLittleEndian(w12);
5283   in += 8;
5284   uint64_t w13 = util::SafeLoadAs<uint64_t>(in);
5285   w13 = arrow::bit_util::FromLittleEndian(w13);
5286   in += 8;
5287   uint64_t w14 = util::SafeLoadAs<uint64_t>(in);
5288   w14 = arrow::bit_util::FromLittleEndian(w14);
5289   in += 8;
5290   uint64_t w15 = util::SafeLoadAs<uint64_t>(in);
5291   w15 = arrow::bit_util::FromLittleEndian(w15);
5292   in += 8;
5293   uint64_t w16 = util::SafeLoadAs<uint64_t>(in);
5294   w16 = arrow::bit_util::FromLittleEndian(w16);
5295   in += 8;
5296   uint64_t w17 = util::SafeLoadAs<uint64_t>(in);
5297   w17 = arrow::bit_util::FromLittleEndian(w17);
5298   in += 8;
5299   uint64_t w18 = util::SafeLoadAs<uint64_t>(in);
5300   w18 = arrow::bit_util::FromLittleEndian(w18);
5301   in += 8;
5302   uint64_t w19 = util::SafeLoadAs<uint64_t>(in);
5303   w19 = arrow::bit_util::FromLittleEndian(w19);
5304   in += 8;
5305   uint64_t w20 = util::SafeLoadAs<uint64_t>(in);
5306   w20 = arrow::bit_util::FromLittleEndian(w20);
5307   in += 8;
5308   uint64_t w21 = util::SafeLoadAs<uint64_t>(in);
5309   w21 = arrow::bit_util::FromLittleEndian(w21);
5310   in += 8;
5311   uint64_t w22 = util::SafeLoadAs<uint64_t>(in);
5312   w22 = arrow::bit_util::FromLittleEndian(w22);
5313   in += 8;
5314   uint64_t w23 = util::SafeLoadAs<uint64_t>(in);
5315   w23 = arrow::bit_util::FromLittleEndian(w23);
5316   in += 8;
5317   uint64_t w24 = util::SafeLoadAs<uint64_t>(in);
5318   w24 = arrow::bit_util::FromLittleEndian(w24);
5319   in += 8;
5320   uint64_t w25 = util::SafeLoadAs<uint64_t>(in);
5321   w25 = arrow::bit_util::FromLittleEndian(w25);
5322   in += 8;
5323   uint64_t w26 = util::SafeLoadAs<uint64_t>(in);
5324   w26 = arrow::bit_util::FromLittleEndian(w26);
5325   in += 8;
5326   uint64_t w27 = util::SafeLoadAs<uint64_t>(in);
5327   w27 = arrow::bit_util::FromLittleEndian(w27);
5328   in += 8;
5329   uint64_t w28 = util::SafeLoadAs<uint64_t>(in);
5330   w28 = arrow::bit_util::FromLittleEndian(w28);
5331   in += 8;
5332   uint64_t w29 = util::SafeLoadAs<uint64_t>(in);
5333   w29 = arrow::bit_util::FromLittleEndian(w29);
5334   in += 8;
5335   uint64_t w30 = util::SafeLoadAs<uint64_t>(in);
5336   w30 = arrow::bit_util::FromLittleEndian(w30);
5337   in += 8;
5338   out[0] = (w0)&mask;
5339   out[1] = ((w0 >> 62) | (w1 << 2)) & mask;
5340   out[2] = ((w1 >> 60) | (w2 << 4)) & mask;
5341   out[3] = ((w2 >> 58) | (w3 << 6)) & mask;
5342   out[4] = ((w3 >> 56) | (w4 << 8)) & mask;
5343   out[5] = ((w4 >> 54) | (w5 << 10)) & mask;
5344   out[6] = ((w5 >> 52) | (w6 << 12)) & mask;
5345   out[7] = ((w6 >> 50) | (w7 << 14)) & mask;
5346   out[8] = ((w7 >> 48) | (w8 << 16)) & mask;
5347   out[9] = ((w8 >> 46) | (w9 << 18)) & mask;
5348   out[10] = ((w9 >> 44) | (w10 << 20)) & mask;
5349   out[11] = ((w10 >> 42) | (w11 << 22)) & mask;
5350   out[12] = ((w11 >> 40) | (w12 << 24)) & mask;
5351   out[13] = ((w12 >> 38) | (w13 << 26)) & mask;
5352   out[14] = ((w13 >> 36) | (w14 << 28)) & mask;
5353   out[15] = ((w14 >> 34) | (w15 << 30)) & mask;
5354   out[16] = ((w15 >> 32) | (w16 << 32)) & mask;
5355   out[17] = ((w16 >> 30) | (w17 << 34)) & mask;
5356   out[18] = ((w17 >> 28) | (w18 << 36)) & mask;
5357   out[19] = ((w18 >> 26) | (w19 << 38)) & mask;
5358   out[20] = ((w19 >> 24) | (w20 << 40)) & mask;
5359   out[21] = ((w20 >> 22) | (w21 << 42)) & mask;
5360   out[22] = ((w21 >> 20) | (w22 << 44)) & mask;
5361   out[23] = ((w22 >> 18) | (w23 << 46)) & mask;
5362   out[24] = ((w23 >> 16) | (w24 << 48)) & mask;
5363   out[25] = ((w24 >> 14) | (w25 << 50)) & mask;
5364   out[26] = ((w25 >> 12) | (w26 << 52)) & mask;
5365   out[27] = ((w26 >> 10) | (w27 << 54)) & mask;
5366   out[28] = ((w27 >> 8) | (w28 << 56)) & mask;
5367   out[29] = ((w28 >> 6) | (w29 << 58)) & mask;
5368   out[30] = ((w29 >> 4) | (w30 << 60)) & mask;
5369   out[31] = w30 >> 2;
5370 
5371   return in;
5372 }
5373 
5374 inline const uint8_t* unpack63_64(const uint8_t* in, uint64_t* out) {
5375   const uint64_t mask = 9223372036854775807ULL;
5376   uint64_t w0 = util::SafeLoadAs<uint64_t>(in);
5377   w0 = arrow::bit_util::FromLittleEndian(w0);
5378   in += 8;
5379   uint64_t w1 = util::SafeLoadAs<uint64_t>(in);
5380   w1 = arrow::bit_util::FromLittleEndian(w1);
5381   in += 8;
5382   uint64_t w2 = util::SafeLoadAs<uint64_t>(in);
5383   w2 = arrow::bit_util::FromLittleEndian(w2);
5384   in += 8;
5385   uint64_t w3 = util::SafeLoadAs<uint64_t>(in);
5386   w3 = arrow::bit_util::FromLittleEndian(w3);
5387   in += 8;
5388   uint64_t w4 = util::SafeLoadAs<uint64_t>(in);
5389   w4 = arrow::bit_util::FromLittleEndian(w4);
5390   in += 8;
5391   uint64_t w5 = util::SafeLoadAs<uint64_t>(in);
5392   w5 = arrow::bit_util::FromLittleEndian(w5);
5393   in += 8;
5394   uint64_t w6 = util::SafeLoadAs<uint64_t>(in);
5395   w6 = arrow::bit_util::FromLittleEndian(w6);
5396   in += 8;
5397   uint64_t w7 = util::SafeLoadAs<uint64_t>(in);
5398   w7 = arrow::bit_util::FromLittleEndian(w7);
5399   in += 8;
5400   uint64_t w8 = util::SafeLoadAs<uint64_t>(in);
5401   w8 = arrow::bit_util::FromLittleEndian(w8);
5402   in += 8;
5403   uint64_t w9 = util::SafeLoadAs<uint64_t>(in);
5404   w9 = arrow::bit_util::FromLittleEndian(w9);
5405   in += 8;
5406   uint64_t w10 = util::SafeLoadAs<uint64_t>(in);
5407   w10 = arrow::bit_util::FromLittleEndian(w10);
5408   in += 8;
5409   uint64_t w11 = util::SafeLoadAs<uint64_t>(in);
5410   w11 = arrow::bit_util::FromLittleEndian(w11);
5411   in += 8;
5412   uint64_t w12 = util::SafeLoadAs<uint64_t>(in);
5413   w12 = arrow::bit_util::FromLittleEndian(w12);
5414   in += 8;
5415   uint64_t w13 = util::SafeLoadAs<uint64_t>(in);
5416   w13 = arrow::bit_util::FromLittleEndian(w13);
5417   in += 8;
5418   uint64_t w14 = util::SafeLoadAs<uint64_t>(in);
5419   w14 = arrow::bit_util::FromLittleEndian(w14);
5420   in += 8;
5421   uint64_t w15 = util::SafeLoadAs<uint64_t>(in);
5422   w15 = arrow::bit_util::FromLittleEndian(w15);
5423   in += 8;
5424   uint64_t w16 = util::SafeLoadAs<uint64_t>(in);
5425   w16 = arrow::bit_util::FromLittleEndian(w16);
5426   in += 8;
5427   uint64_t w17 = util::SafeLoadAs<uint64_t>(in);
5428   w17 = arrow::bit_util::FromLittleEndian(w17);
5429   in += 8;
5430   uint64_t w18 = util::SafeLoadAs<uint64_t>(in);
5431   w18 = arrow::bit_util::FromLittleEndian(w18);
5432   in += 8;
5433   uint64_t w19 = util::SafeLoadAs<uint64_t>(in);
5434   w19 = arrow::bit_util::FromLittleEndian(w19);
5435   in += 8;
5436   uint64_t w20 = util::SafeLoadAs<uint64_t>(in);
5437   w20 = arrow::bit_util::FromLittleEndian(w20);
5438   in += 8;
5439   uint64_t w21 = util::SafeLoadAs<uint64_t>(in);
5440   w21 = arrow::bit_util::FromLittleEndian(w21);
5441   in += 8;
5442   uint64_t w22 = util::SafeLoadAs<uint64_t>(in);
5443   w22 = arrow::bit_util::FromLittleEndian(w22);
5444   in += 8;
5445   uint64_t w23 = util::SafeLoadAs<uint64_t>(in);
5446   w23 = arrow::bit_util::FromLittleEndian(w23);
5447   in += 8;
5448   uint64_t w24 = util::SafeLoadAs<uint64_t>(in);
5449   w24 = arrow::bit_util::FromLittleEndian(w24);
5450   in += 8;
5451   uint64_t w25 = util::SafeLoadAs<uint64_t>(in);
5452   w25 = arrow::bit_util::FromLittleEndian(w25);
5453   in += 8;
5454   uint64_t w26 = util::SafeLoadAs<uint64_t>(in);
5455   w26 = arrow::bit_util::FromLittleEndian(w26);
5456   in += 8;
5457   uint64_t w27 = util::SafeLoadAs<uint64_t>(in);
5458   w27 = arrow::bit_util::FromLittleEndian(w27);
5459   in += 8;
5460   uint64_t w28 = util::SafeLoadAs<uint64_t>(in);
5461   w28 = arrow::bit_util::FromLittleEndian(w28);
5462   in += 8;
5463   uint64_t w29 = util::SafeLoadAs<uint64_t>(in);
5464   w29 = arrow::bit_util::FromLittleEndian(w29);
5465   in += 8;
5466   uint64_t w30 = util::SafeLoadAs<uint64_t>(in);
5467   w30 = arrow::bit_util::FromLittleEndian(w30);
5468   in += 8;
5469   uint64_t w31 = util::SafeLoadAs<uint32_t>(in);
5470   w31 = arrow::bit_util::FromLittleEndian(w31);
5471   in += 4;
5472   out[0] = (w0)&mask;
5473   out[1] = ((w0 >> 63) | (w1 << 1)) & mask;
5474   out[2] = ((w1 >> 62) | (w2 << 2)) & mask;
5475   out[3] = ((w2 >> 61) | (w3 << 3)) & mask;
5476   out[4] = ((w3 >> 60) | (w4 << 4)) & mask;
5477   out[5] = ((w4 >> 59) | (w5 << 5)) & mask;
5478   out[6] = ((w5 >> 58) | (w6 << 6)) & mask;
5479   out[7] = ((w6 >> 57) | (w7 << 7)) & mask;
5480   out[8] = ((w7 >> 56) | (w8 << 8)) & mask;
5481   out[9] = ((w8 >> 55) | (w9 << 9)) & mask;
5482   out[10] = ((w9 >> 54) | (w10 << 10)) & mask;
5483   out[11] = ((w10 >> 53) | (w11 << 11)) & mask;
5484   out[12] = ((w11 >> 52) | (w12 << 12)) & mask;
5485   out[13] = ((w12 >> 51) | (w13 << 13)) & mask;
5486   out[14] = ((w13 >> 50) | (w14 << 14)) & mask;
5487   out[15] = ((w14 >> 49) | (w15 << 15)) & mask;
5488   out[16] = ((w15 >> 48) | (w16 << 16)) & mask;
5489   out[17] = ((w16 >> 47) | (w17 << 17)) & mask;
5490   out[18] = ((w17 >> 46) | (w18 << 18)) & mask;
5491   out[19] = ((w18 >> 45) | (w19 << 19)) & mask;
5492   out[20] = ((w19 >> 44) | (w20 << 20)) & mask;
5493   out[21] = ((w20 >> 43) | (w21 << 21)) & mask;
5494   out[22] = ((w21 >> 42) | (w22 << 22)) & mask;
5495   out[23] = ((w22 >> 41) | (w23 << 23)) & mask;
5496   out[24] = ((w23 >> 40) | (w24 << 24)) & mask;
5497   out[25] = ((w24 >> 39) | (w25 << 25)) & mask;
5498   out[26] = ((w25 >> 38) | (w26 << 26)) & mask;
5499   out[27] = ((w26 >> 37) | (w27 << 27)) & mask;
5500   out[28] = ((w27 >> 36) | (w28 << 28)) & mask;
5501   out[29] = ((w28 >> 35) | (w29 << 29)) & mask;
5502   out[30] = ((w29 >> 34) | (w30 << 30)) & mask;
5503   out[31] = ((w30 >> 33) | (w31 << 31)) & mask;
5504 
5505   return in;
5506 }
5507 
5508 inline const uint8_t* unpack64_64(const uint8_t* in, uint64_t* out) {
5509   uint64_t w0 = util::SafeLoadAs<uint64_t>(in);
5510   w0 = arrow::bit_util::FromLittleEndian(w0);
5511   in += 8;
5512   uint64_t w1 = util::SafeLoadAs<uint64_t>(in);
5513   w1 = arrow::bit_util::FromLittleEndian(w1);
5514   in += 8;
5515   uint64_t w2 = util::SafeLoadAs<uint64_t>(in);
5516   w2 = arrow::bit_util::FromLittleEndian(w2);
5517   in += 8;
5518   uint64_t w3 = util::SafeLoadAs<uint64_t>(in);
5519   w3 = arrow::bit_util::FromLittleEndian(w3);
5520   in += 8;
5521   uint64_t w4 = util::SafeLoadAs<uint64_t>(in);
5522   w4 = arrow::bit_util::FromLittleEndian(w4);
5523   in += 8;
5524   uint64_t w5 = util::SafeLoadAs<uint64_t>(in);
5525   w5 = arrow::bit_util::FromLittleEndian(w5);
5526   in += 8;
5527   uint64_t w6 = util::SafeLoadAs<uint64_t>(in);
5528   w6 = arrow::bit_util::FromLittleEndian(w6);
5529   in += 8;
5530   uint64_t w7 = util::SafeLoadAs<uint64_t>(in);
5531   w7 = arrow::bit_util::FromLittleEndian(w7);
5532   in += 8;
5533   uint64_t w8 = util::SafeLoadAs<uint64_t>(in);
5534   w8 = arrow::bit_util::FromLittleEndian(w8);
5535   in += 8;
5536   uint64_t w9 = util::SafeLoadAs<uint64_t>(in);
5537   w9 = arrow::bit_util::FromLittleEndian(w9);
5538   in += 8;
5539   uint64_t w10 = util::SafeLoadAs<uint64_t>(in);
5540   w10 = arrow::bit_util::FromLittleEndian(w10);
5541   in += 8;
5542   uint64_t w11 = util::SafeLoadAs<uint64_t>(in);
5543   w11 = arrow::bit_util::FromLittleEndian(w11);
5544   in += 8;
5545   uint64_t w12 = util::SafeLoadAs<uint64_t>(in);
5546   w12 = arrow::bit_util::FromLittleEndian(w12);
5547   in += 8;
5548   uint64_t w13 = util::SafeLoadAs<uint64_t>(in);
5549   w13 = arrow::bit_util::FromLittleEndian(w13);
5550   in += 8;
5551   uint64_t w14 = util::SafeLoadAs<uint64_t>(in);
5552   w14 = arrow::bit_util::FromLittleEndian(w14);
5553   in += 8;
5554   uint64_t w15 = util::SafeLoadAs<uint64_t>(in);
5555   w15 = arrow::bit_util::FromLittleEndian(w15);
5556   in += 8;
5557   uint64_t w16 = util::SafeLoadAs<uint64_t>(in);
5558   w16 = arrow::bit_util::FromLittleEndian(w16);
5559   in += 8;
5560   uint64_t w17 = util::SafeLoadAs<uint64_t>(in);
5561   w17 = arrow::bit_util::FromLittleEndian(w17);
5562   in += 8;
5563   uint64_t w18 = util::SafeLoadAs<uint64_t>(in);
5564   w18 = arrow::bit_util::FromLittleEndian(w18);
5565   in += 8;
5566   uint64_t w19 = util::SafeLoadAs<uint64_t>(in);
5567   w19 = arrow::bit_util::FromLittleEndian(w19);
5568   in += 8;
5569   uint64_t w20 = util::SafeLoadAs<uint64_t>(in);
5570   w20 = arrow::bit_util::FromLittleEndian(w20);
5571   in += 8;
5572   uint64_t w21 = util::SafeLoadAs<uint64_t>(in);
5573   w21 = arrow::bit_util::FromLittleEndian(w21);
5574   in += 8;
5575   uint64_t w22 = util::SafeLoadAs<uint64_t>(in);
5576   w22 = arrow::bit_util::FromLittleEndian(w22);
5577   in += 8;
5578   uint64_t w23 = util::SafeLoadAs<uint64_t>(in);
5579   w23 = arrow::bit_util::FromLittleEndian(w23);
5580   in += 8;
5581   uint64_t w24 = util::SafeLoadAs<uint64_t>(in);
5582   w24 = arrow::bit_util::FromLittleEndian(w24);
5583   in += 8;
5584   uint64_t w25 = util::SafeLoadAs<uint64_t>(in);
5585   w25 = arrow::bit_util::FromLittleEndian(w25);
5586   in += 8;
5587   uint64_t w26 = util::SafeLoadAs<uint64_t>(in);
5588   w26 = arrow::bit_util::FromLittleEndian(w26);
5589   in += 8;
5590   uint64_t w27 = util::SafeLoadAs<uint64_t>(in);
5591   w27 = arrow::bit_util::FromLittleEndian(w27);
5592   in += 8;
5593   uint64_t w28 = util::SafeLoadAs<uint64_t>(in);
5594   w28 = arrow::bit_util::FromLittleEndian(w28);
5595   in += 8;
5596   uint64_t w29 = util::SafeLoadAs<uint64_t>(in);
5597   w29 = arrow::bit_util::FromLittleEndian(w29);
5598   in += 8;
5599   uint64_t w30 = util::SafeLoadAs<uint64_t>(in);
5600   w30 = arrow::bit_util::FromLittleEndian(w30);
5601   in += 8;
5602   uint64_t w31 = util::SafeLoadAs<uint64_t>(in);
5603   w31 = arrow::bit_util::FromLittleEndian(w31);
5604   in += 8;
5605   out[0] = w0;
5606   out[1] = w1;
5607   out[2] = w2;
5608   out[3] = w3;
5609   out[4] = w4;
5610   out[5] = w5;
5611   out[6] = w6;
5612   out[7] = w7;
5613   out[8] = w8;
5614   out[9] = w9;
5615   out[10] = w10;
5616   out[11] = w11;
5617   out[12] = w12;
5618   out[13] = w13;
5619   out[14] = w14;
5620   out[15] = w15;
5621   out[16] = w16;
5622   out[17] = w17;
5623   out[18] = w18;
5624   out[19] = w19;
5625   out[20] = w20;
5626   out[21] = w21;
5627   out[22] = w22;
5628   out[23] = w23;
5629   out[24] = w24;
5630   out[25] = w25;
5631   out[26] = w26;
5632   out[27] = w27;
5633   out[28] = w28;
5634   out[29] = w29;
5635   out[30] = w30;
5636   out[31] = w31;
5637 
5638   return in;
5639 }
5640 
5641 }  // namespace internal
5642 }  // namespace arrow