diff --git a/bitpack.h b/bitpack.h index 94a1d27..bbc01eb 100644 --- a/bitpack.h +++ b/bitpack.h @@ -22,11 +22,16 @@ - email : powturbo [_AT_] gmail [_DOT_] com **/ // bitpack.h - "Integer Compression" Binary Packing header file +#ifndef BITPACK_H_ +#define BITPACK_H_ #ifdef __cplusplus extern "C" { #endif #include + +//********************************** Bit Packing : Pack **************************************************************** + // bipackNN: Pack array with n unsigned (NN bits in[n]) values to the buffer out using nbits per value. Return value = end of compressed buffer out unsigned char *bitpack32( unsigned *__restrict in, unsigned n, unsigned char *__restrict out , unsigned b); unsigned char *bitpack16( unsigned short *__restrict in, unsigned n, unsigned char *__restrict out , unsigned b); @@ -55,6 +60,95 @@ unsigned char *bitdpack256v32( unsigned *__restrict in, unsigned n, uns unsigned char *bitd1pack256v32(unsigned *__restrict in, unsigned n, unsigned char *__restrict out, unsigned start, unsigned b); unsigned char *bitzpack256v32( unsigned *__restrict in, unsigned n, unsigned char *__restrict out, unsigned start, unsigned b); +//********************************** Bit Packing : Unpack **************************************************************** + +// ---------------- Unpack a b-bits packed integer array -------------------------------------------------------------------------------------- +// unpack a bitpacked integer array. Return value = end of packed buffer in +unsigned char *bitunpack16(const unsigned char *__restrict in, unsigned n, unsigned short *__restrict out, unsigned b); +unsigned char *bitunpack32(const unsigned char *__restrict in, unsigned n, unsigned *__restrict out, unsigned b); +unsigned char *bitunpack64(const unsigned char *__restrict in, unsigned n, uint64_t *__restrict out, unsigned b); + +// ---------------- Direct Access to a single packed integer array entry -------------------------------------------------------------------- + #ifndef NTURBOPFOR_DAC + #ifdef __AVX2__ +#include +#define bzhi64(_u_, _b_) _bzhi_u64(_u_, _b_) +#define bzhi32(_u_, _b_) _bzhi_u32(_u_, _b_) + #else +#define bzhi64(_u_, _b_) ((_u_) & ((1ull<<(_b_))-1)) +#define bzhi32(_u_, _b_) ((_u_) & ((1u <<(_b_))-1)) + #endif + +#include "conf.h" + +// Get a single 32 bits value with index "idx" (or bit index b*idx) from packed integer array +static ALWAYS_INLINE unsigned bitgetx32(const unsigned char *__restrict in, unsigned idx, unsigned b) { unsigned bidx = b*idx; return bzhi64( ctou64((unsigned *)in+(bidx>>5)) >> (bidx&0x1f), b ); } +static ALWAYS_INLINE unsigned _bitgetx32(const unsigned char *__restrict in, unsigned bidx, unsigned b) { return bzhi64( ctou64((unsigned *)in+(bidx>>5)) >> (bidx&0x1f), b ); } + +// like bitgetx32 but for 16 bits integer array +static ALWAYS_INLINE unsigned bitgetx16(const unsigned char *__restrict in, unsigned idx, unsigned b) { unsigned bidx = b*idx; return bzhi32( ctou32((unsigned *)in+(bidx>>4)) >> (bidx& 0xf), b ); } +static ALWAYS_INLINE unsigned _bitgetx16(const unsigned char *__restrict in, unsigned bidx, unsigned b) { return bzhi32( ctou32((unsigned *)in+(bidx>>4)) >> (bidx& 0xf), b ); } + +// 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<