public int packUnsafe(int valCount, Object inBase, long inAddr, Object outBase, long outAddr) {
        int step = valCount >>> 3;
        for (int s = 0; s < step; s++) {
            //int valIndex = s << 3;
            pack8Values(inBase, inAddr + ((s << 3) << 2), outBase, outAddr + (s * bitWidth));
        }

        int tail = valCount & 0x07;
        if (tail != 0) {
            int tailStart = (valCount >>> 3) << 3;
            int[] tailData = new int[8];
            for (int i = 0; i < valCount - tailStart; i++) {
                tailData[i] = UnsafeUtil.getInt(inBase, inAddr + ((tailStart + i) << 2));
            }
            pack8Values(tailData, UnsafeUtil.INT_ARRAY_OFFSET, outBase, outAddr + (valCount >>> 3) * bitWidth);
        }
        return PackingUtil.packingOutputBytes(valCount, bitWidth);
    }
unpack bitWidth bytes from input into 8 values in output.
nextPosition: input = (inAddr + bitWidth), output = (outAddr + 8 * 4)
indexr-vlt-segment/src/main/java/io/indexr/vlt/codec/pack/IntPacker.java