From e1ca546c62a88fe96ce10093273aabc1a5146863 Mon Sep 17 00:00:00 2001 From: x Date: Sat, 21 Dec 2019 14:06:32 +0100 Subject: [PATCH] TurboPFor: Bit Pack/UnPack c/c++ header --- bitpack.h | 96 +++++++++++++++++++++++++++---------------------------- 1 file changed, 48 insertions(+), 48 deletions(-) diff --git a/bitpack.h b/bitpack.h index 3cf0724..e4a2e68 100644 --- a/bitpack.h +++ b/bitpack.h @@ -1,7 +1,7 @@ /** Copyright (C) powturbo 2013-2019 GPL v2 License - + This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or @@ -26,7 +26,7 @@ #define BITPACK_H_ #if defined(_MSC_VER) && _MSC_VER < 1600 #include "vs/stdint.h" -#else +#else #include #endif #include @@ -36,55 +36,55 @@ extern "C" { #endif //******************** Bit Packing High Level API - n unlimited *************************************************** -size_t bitnpack8( uint8_t *__restrict in, size_t n, unsigned char *__restrict out); -size_t bitnpack16( uint16_t *__restrict in, size_t n, unsigned char *__restrict out); -size_t bitnpack32( uint32_t *__restrict in, size_t n, unsigned char *__restrict out); +size_t bitnpack8( uint8_t *__restrict in, size_t n, unsigned char *__restrict out); +size_t bitnpack16( uint16_t *__restrict in, size_t n, unsigned char *__restrict out); +size_t bitnpack32( uint32_t *__restrict in, size_t n, unsigned char *__restrict out); size_t bitnpack64( uint64_t *__restrict in, size_t n, unsigned char *__restrict out); -size_t bitnpack128v16( uint16_t *__restrict in, size_t n, unsigned char *__restrict out); +size_t bitnpack128v16( uint16_t *__restrict in, size_t n, unsigned char *__restrict out); size_t bitnpack128v32( uint32_t *__restrict in, size_t n, unsigned char *__restrict out); size_t bitnpack128v64( uint64_t *__restrict in, size_t n, unsigned char *__restrict out); size_t bitnpack256v32( uint32_t *__restrict in, size_t n, unsigned char *__restrict out); -size_t bitndpack8( uint8_t *__restrict in, size_t n, unsigned char *__restrict out); -size_t bitndpack16( uint16_t *__restrict in, size_t n, unsigned char *__restrict out); -size_t bitndpack32( uint32_t *__restrict in, size_t n, unsigned char *__restrict out); +size_t bitndpack8( uint8_t *__restrict in, size_t n, unsigned char *__restrict out); +size_t bitndpack16( uint16_t *__restrict in, size_t n, unsigned char *__restrict out); +size_t bitndpack32( uint32_t *__restrict in, size_t n, unsigned char *__restrict out); size_t bitndpack64( uint64_t *__restrict in, size_t n, unsigned char *__restrict out); -size_t bitndpack128v16( uint16_t *__restrict in, size_t n, unsigned char *__restrict out); -size_t bitndpack128v32( uint32_t *__restrict in, size_t n, unsigned char *__restrict out); +size_t bitndpack128v16( uint16_t *__restrict in, size_t n, unsigned char *__restrict out); +size_t bitndpack128v32( uint32_t *__restrict in, size_t n, unsigned char *__restrict out); size_t bitndpack256v32( uint32_t *__restrict in, size_t n, unsigned char *__restrict out); -size_t bitnd1pack8( uint8_t *__restrict in, size_t n, unsigned char *__restrict out); -size_t bitnd1pack16( uint16_t *__restrict in, size_t n, unsigned char *__restrict out); -size_t bitnd1pack32( uint32_t *__restrict in, size_t n, unsigned char *__restrict out); +size_t bitnd1pack8( uint8_t *__restrict in, size_t n, unsigned char *__restrict out); +size_t bitnd1pack16( uint16_t *__restrict in, size_t n, unsigned char *__restrict out); +size_t bitnd1pack32( uint32_t *__restrict in, size_t n, unsigned char *__restrict out); size_t bitnd1pack64( uint64_t *__restrict in, size_t n, unsigned char *__restrict out); -size_t bitnd1pack128v16( uint16_t *__restrict in, size_t n, unsigned char *__restrict out); -size_t bitnd1pack128v32( uint32_t *__restrict in, size_t n, unsigned char *__restrict out); -size_t bitnd1pack256v32( uint32_t *__restrict in, size_t n, unsigned char *__restrict out); +size_t bitnd1pack128v16( uint16_t *__restrict in, size_t n, unsigned char *__restrict out); +size_t bitnd1pack128v32( uint32_t *__restrict in, size_t n, unsigned char *__restrict out); +size_t bitnd1pack256v32( uint32_t *__restrict in, size_t n, unsigned char *__restrict out); -size_t bitnzpack8( uint8_t *__restrict in, size_t n, unsigned char *__restrict out); -size_t bitnzpack16( uint16_t *__restrict in, size_t n, unsigned char *__restrict out); -size_t bitnzpack32( uint32_t *__restrict in, size_t n, unsigned char *__restrict out); +size_t bitnzpack8( uint8_t *__restrict in, size_t n, unsigned char *__restrict out); +size_t bitnzpack16( uint16_t *__restrict in, size_t n, unsigned char *__restrict out); +size_t bitnzpack32( uint32_t *__restrict in, size_t n, unsigned char *__restrict out); size_t bitnzpack64( uint64_t *__restrict in, size_t n, unsigned char *__restrict out); -size_t bitnzpack128v16( uint16_t *__restrict in, size_t n, unsigned char *__restrict out); -size_t bitnzpack128v32( uint32_t *__restrict in, size_t n, unsigned char *__restrict out); +size_t bitnzpack128v16( uint16_t *__restrict in, size_t n, unsigned char *__restrict out); +size_t bitnzpack128v32( uint32_t *__restrict in, size_t n, unsigned char *__restrict out); size_t bitnzpack256v32( uint32_t *__restrict in, size_t n, unsigned char *__restrict out); -size_t bitnfpack8( uint8_t *__restrict in, size_t n, unsigned char *__restrict out); -size_t bitnfpack16( uint16_t *__restrict in, size_t n, unsigned char *__restrict out); -size_t bitnfpack32( uint32_t *__restrict in, size_t n, unsigned char *__restrict out); +size_t bitnfpack8( uint8_t *__restrict in, size_t n, unsigned char *__restrict out); +size_t bitnfpack16( uint16_t *__restrict in, size_t n, unsigned char *__restrict out); +size_t bitnfpack32( uint32_t *__restrict in, size_t n, unsigned char *__restrict out); size_t bitnfpack64( uint64_t *__restrict in, size_t n, unsigned char *__restrict out); -size_t bitnfpack128v16( uint16_t *__restrict in, size_t n, unsigned char *__restrict out); -size_t bitnfpack128v32( uint32_t *__restrict in, size_t n, unsigned char *__restrict out); +size_t bitnfpack128v16( uint16_t *__restrict in, size_t n, unsigned char *__restrict out); +size_t bitnfpack128v32( uint32_t *__restrict in, size_t n, unsigned char *__restrict out); size_t bitnfpack256v32( uint32_t *__restrict in, size_t n, unsigned char *__restrict out); size_t bitnunpack8( unsigned char *__restrict in, size_t n, uint8_t *__restrict out); size_t bitnunpack16( unsigned char *__restrict in, size_t n, uint16_t *__restrict out); -size_t bitnunpack32( unsigned char *__restrict in, size_t n, uint32_t *__restrict out); +size_t bitnunpack32( unsigned char *__restrict in, size_t n, uint32_t *__restrict out); size_t bitnunpack64( unsigned char *__restrict in, size_t n, uint64_t *__restrict out); size_t bitnunpack128v16( unsigned char *__restrict in, size_t n, uint16_t *__restrict out); -size_t bitnunpack128v32( unsigned char *__restrict in, size_t n, uint32_t *__restrict out); -size_t bitnunpack128v64( unsigned char *__restrict in, size_t n, uint64_t *__restrict out); -size_t bitnunpack256v32( unsigned char *__restrict in, size_t n, uint32_t *__restrict out); +size_t bitnunpack128v32( unsigned char *__restrict in, size_t n, uint32_t *__restrict out); +size_t bitnunpack128v64( unsigned char *__restrict in, size_t n, uint64_t *__restrict out); +size_t bitnunpack256v32( unsigned char *__restrict in, size_t n, uint32_t *__restrict out); size_t bitndunpack8( unsigned char *__restrict in, size_t n, uint8_t *__restrict out); size_t bitndunpack16( unsigned char *__restrict in, size_t n, uint16_t *__restrict out); @@ -92,7 +92,7 @@ size_t bitndunpack32( unsigned char *__restrict in, size_t n, uint32_t *__re size_t bitndunpack64( unsigned char *__restrict in, size_t n, uint64_t *__restrict out); size_t bitndunpack128v16( unsigned char *__restrict in, size_t n, uint16_t *__restrict out); size_t bitndunpack128v32( unsigned char *__restrict in, size_t n, uint32_t *__restrict out); -size_t bitndunpack256v32( unsigned char *__restrict in, size_t n, uint32_t *__restrict out); +size_t bitndunpack256v32( unsigned char *__restrict in, size_t n, uint32_t *__restrict out); size_t bitnd1unpack8( unsigned char *__restrict in, size_t n, uint8_t *__restrict out); size_t bitnd1unpack16( unsigned char *__restrict in, size_t n, uint16_t *__restrict out); @@ -154,24 +154,24 @@ unsigned char *bitzpack64( uint64_t *__restrict in, unsigned n, const unsigned //-------------------------------------- SIMD ------------------------------------------------------------------------------------------ // Pack array with 128 unsigned (32 bits in[n]) values to the buffer out using nbits per value. Return value = end of compressed buffer out -unsigned char *bitpack128v16( unsigned short *__restrict in, unsigned n, unsigned char *__restrict out , unsigned b); +unsigned char *bitpack128v16( unsigned short *__restrict in, unsigned n, unsigned char *__restrict out , unsigned b); unsigned char *bitdpack128v16( unsigned short *__restrict in, unsigned n, unsigned char *__restrict out, unsigned short start, unsigned b); unsigned char *bitd1pack128v16(unsigned short *__restrict in, unsigned n, unsigned char *__restrict out, unsigned short start, unsigned b); unsigned char *bitfpack128v16( unsigned short *__restrict in, unsigned n, unsigned char *__restrict out, unsigned short start, unsigned b); unsigned char *bitf1pack128v16(unsigned short *__restrict in, unsigned n, unsigned char *__restrict out, unsigned short start, unsigned b); unsigned char *bitzpack128v16( unsigned short *__restrict in, unsigned n, unsigned char *__restrict out, unsigned short start, unsigned b); -unsigned char *bitpack128v32( unsigned *__restrict in, unsigned n, unsigned char *__restrict out , unsigned b); +unsigned char *bitpack128v32( unsigned *__restrict in, unsigned n, unsigned char *__restrict out , unsigned b); unsigned char *bitdpack128v32( unsigned *__restrict in, unsigned n, unsigned char *__restrict out, unsigned start, unsigned b); unsigned char *bitd1pack128v32(unsigned *__restrict in, unsigned n, unsigned char *__restrict out, unsigned start, unsigned b); unsigned char *bitfpack128v32( unsigned *__restrict in, unsigned n, unsigned char *__restrict out, unsigned start, unsigned b); unsigned char *bitf1pack128v32(unsigned *__restrict in, unsigned n, unsigned char *__restrict out, unsigned start, unsigned b); unsigned char *bitzpack128v32( unsigned *__restrict in, unsigned n, unsigned char *__restrict out, unsigned start, unsigned b); -//unsigned char *bitpack256w32( unsigned *__restrict in, unsigned n, unsigned char *__restrict out , unsigned b); -unsigned char *bitpack128v64( uint64_t *__restrict in, unsigned n, unsigned char *__restrict out , unsigned b); +//unsigned char *bitpack256w32( unsigned *__restrict in, unsigned n, unsigned char *__restrict out , unsigned b); +unsigned char *bitpack128v64( uint64_t *__restrict in, unsigned n, unsigned char *__restrict out , unsigned b); -unsigned char *bitpack256v32( unsigned *__restrict in, unsigned n, unsigned char *__restrict out , unsigned b); +unsigned char *bitpack256v32( unsigned *__restrict in, unsigned n, unsigned char *__restrict out , unsigned b); unsigned char *bitdpack256v32( unsigned *__restrict in, unsigned n, unsigned char *__restrict out, unsigned start, unsigned b); unsigned char *bitd1pack256v32(unsigned *__restrict in, unsigned n, unsigned char *__restrict out, unsigned start, unsigned b); unsigned char *bitfpack256v32( unsigned *__restrict in, unsigned n, unsigned char *__restrict out, unsigned start, unsigned b); @@ -181,7 +181,7 @@ unsigned char *bitzpack256v32( unsigned *__restrict in, unsigned n, uns //********************************** Bit Packing : Unpack **************************************************************** // ---------------- Unpack a b-bits packed integer array ------------------------------------------------------------------------------- -// unpack a bitpacked integer array. Return value = end of packed buffer in +// unpack a bitpacked integer array. Return value = end of packed buffer in unsigned char *bitunpack8( const unsigned char *__restrict in, unsigned n, uint8_t *__restrict out, unsigned b); unsigned char *bitunpack16( const unsigned char *__restrict in, unsigned n, uint16_t *__restrict out, unsigned b); unsigned char *bitunpack32( const unsigned char *__restrict in, unsigned n, uint32_t *__restrict out, unsigned b); @@ -212,7 +212,7 @@ static ALWAYS_INLINE unsigned _bitgetx8( const unsigned char *__restrict in, uns static ALWAYS_INLINE unsigned bitgetx16(const unsigned char *__restrict in, unsigned idx, unsigned b) { unsigned bidx = b*idx; return bzhi32( ctou32((uint32_t *)in+(bidx>>4)) >> (bidx& 0xf), b ); } static ALWAYS_INLINE unsigned _bitgetx16(const unsigned char *__restrict in, unsigned bidx, unsigned b) { return bzhi32( ctou32((uint32_t *)in+(bidx>>4)) >> (bidx& 0xf), b ); } -// Set a single value with index "idx" +// Set a single value with index "idx" static ALWAYS_INLINE void bitsetx16(const unsigned char *__restrict in, unsigned idx, unsigned v, unsigned b) { unsigned bidx = b*idx; unsigned *p = (unsigned *) in+(bidx>>4) ; *p = ( *p & ~(((1u <>5)); *p = ( *p & ~(((1ull<