diff --git a/bitunpack.c b/bitunpack.c index 14550ad..6ffd8cf 100644 --- a/bitunpack.c +++ b/bitunpack.c @@ -1,7 +1,7 @@ /** - Copyright (C) powturbo 2013-2014 + Copyright (C) powturbo 2013-2015 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 @@ -16,50 +16,138 @@ with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - - email : powturbo [AT] gmail.com - - github : https://github.com/powturbo - homepage : https://sites.google.com/site/powturbo/ + - github : https://github.com/powturbo - twitter : https://twitter.com/powturbo - - bitunpack_.h - "Integer Compression" Binary Packing + - email : powturbo [_AT_] gmail [_DOT_] com **/ +// bitunpack_.h - "Integer Compression" Bit Packing + + #ifndef BPI #include "conf.h" #include "bitunpack.h" #define PAD8(__x) (((__x)+7)/8) - + //----------------------------------------------------------------------------------------------------------------- #define BPI(__w, __op, __parm) __w -#include "bitunpack_.h" -unsigned char *bitunpack32( unsigned char *__restrict in, unsigned n, unsigned b, unsigned *__restrict out) { unsigned char *ip = in+PAD8(n*b); BITUNPACK32(in, n, b, out, 0); return ip; } -unsigned char *bitunpack16( unsigned char *__restrict in, unsigned n, unsigned b, unsigned short *__restrict out) { unsigned char *ip = in+PAD8(n*b); BITUNPACK32(in, n, b, out, 0); return ip; } +#include __FILE__ +unsigned char *bitunpack32( unsigned char *__restrict in, unsigned n, unsigned *__restrict out , unsigned b) { unsigned char *ip = in+PAD8(n*b); BITUNPACK32(in, n, b, out, 0); return ip; } +unsigned char *bitunpack16( unsigned char *__restrict in, unsigned n, unsigned short *__restrict out , unsigned b) { unsigned char *ip = in+PAD8(n*b); BITUNPACK32(in, n, b, out, 0); return ip; } #undef BPI //----------------------------------------------------------------------------------------------------------------- #define BPI(__w, __op, __parm) (__parm += (__w) + 1) -#include "bitunpack_.h" -unsigned char *bitdunpack32( unsigned char *__restrict in, unsigned n, unsigned b, int start, unsigned *__restrict out) { unsigned char *ip = in+PAD8(n*b); BITUNPACK32(in, n, b, out, start); return ip; } -unsigned char *bitdunpack16( unsigned char *__restrict in, unsigned n, unsigned b, int start, unsigned short *__restrict out) { unsigned char *ip = in+PAD8(n*b); BITUNPACK32(in, n, b, out, start); return ip; } +#include __FILE__ +unsigned char *bitd1unpack32(unsigned char *__restrict in, unsigned n, unsigned *__restrict out, unsigned start, unsigned b) { unsigned char *ip = in+PAD8(n*b); BITUNPACK32(in, n, b, out, start); return ip; } +unsigned char *bitd1unpack16(unsigned char *__restrict in, unsigned n, unsigned short *__restrict out, unsigned start, unsigned b) { unsigned char *ip = in+PAD8(n*b); BITUNPACK32(in, n, b, out, start); return ip; } #undef BPI //------------------------------------------------------------------------------------------ #define BPI(__w, __op, __parm) (__parm += (__w)) -#include "bitunpack_.h" -unsigned char *bitd0unpack32( unsigned char *__restrict in, unsigned n, unsigned b, int start, unsigned *__restrict out) { unsigned char *ip = in+PAD8(n*b); BITUNPACK32(in, n, b, out, start); return ip; } -unsigned char *bitd0unpack16( unsigned char *__restrict in, unsigned n, unsigned b, int start, unsigned short *__restrict out) { unsigned char *ip = in+PAD8(n*b); BITUNPACK32(in, n, b, out, start); return ip; } +#include __FILE__ +unsigned char *bitdunpack32( unsigned char *__restrict in, unsigned n, unsigned *__restrict out, unsigned start, unsigned b) { unsigned char *ip = in+PAD8(n*b); BITUNPACK32(in, n, b, out, start); return ip; } +unsigned char *bitdunpack16( unsigned char *__restrict in, unsigned n, unsigned short *__restrict out, unsigned start, unsigned b) { unsigned char *ip = in+PAD8(n*b); BITUNPACK32(in, n, b, out, start); return ip; } #undef BPI //------------------------------------------------------------------------------------------ #define BPI(__w, __op, __parm) (__parm + (__op+1-_op))//#define BPI(__w, __op, __parm) (__parm + (__w) + 1) -#include "bitunpack_.h" -unsigned char *bitfunpack32( unsigned char *__restrict in, unsigned n, unsigned b, int start, unsigned *__restrict out) { unsigned char *ip = in+PAD8(n*b); BITUNPACK32(in, n, b, out, start); return ip; } -unsigned char *bitfunpack16( unsigned char *__restrict in, unsigned n, unsigned b, int start, unsigned short *__restrict out) { unsigned char *ip = in+PAD8(n*b); BITUNPACK32(in, n, b, out, start); return ip; } +#include __FILE__ +unsigned char *bitf1unpack32(unsigned char *__restrict in, unsigned n, unsigned *__restrict out, unsigned start, unsigned b) { unsigned char *ip = in+PAD8(n*b); BITUNPACK32(in, n, b, out, start); return ip; } +unsigned char *bitf1unpack16(unsigned char *__restrict in, unsigned n, unsigned short *__restrict out, unsigned start, unsigned b) { unsigned char *ip = in+PAD8(n*b); BITUNPACK32(in, n, b, out, start); return ip; } #undef BPI //------------------------------------------------------------------------------------------ #define BPI(__w, __op, __parm) (__parm + (__op-_op)) -#include "bitunpack_.h" +#include __FILE__ -unsigned char *bitf0unpack32( unsigned char *__restrict in, unsigned n, unsigned b, int start, unsigned *__restrict out) { unsigned char *ip = in+PAD8(n*b); BITUNPACK32(in, n, b, out, start); return ip; } -unsigned char *bitf0unpack16( unsigned char *__restrict in, unsigned n, unsigned b, int start, unsigned short *__restrict out) { unsigned char *ip = in+PAD8(n*b); BITUNPACK32(in, n, b, out, start); return ip; } +unsigned char *bitfunpack32( unsigned char *__restrict in, unsigned n, unsigned *__restrict out, unsigned start, unsigned b) { unsigned char *ip = in+PAD8(n*b); BITUNPACK32(in, n, b, out, start); return ip; } +unsigned char *bitfunpack16( unsigned char *__restrict in, unsigned n, unsigned short *__restrict out, unsigned start, unsigned b) { unsigned char *ip = in+PAD8(n*b); BITUNPACK32(in, n, b, out, start); return ip; } #undef BPI + #else +#include +#define DST( __op,__x, __w, __parm) *__op++ = BPI(__w, __op, __parm) //__op[__x] = BPI(__w,__parm) // +#define DSTI(__op) //__op += 32 // + +#define USE_BITUNPACK 64 + + #if USE_BITUNPACK == 64 +#include "bitunpack64_.h" +#define BITUNPACK32(__ip, __n, __nbits, __op, __parm) { typeof(__op[0]) *__ope = __op + __n,*_op=__op;\ + switch(__nbits) {\ + case 0: do BITUNPACK64_0( __ip, __op, __parm) while(__op<__ope); break;\ + case 1: do BITUNPACK64_1( __ip, __op, __parm) while(__op<__ope); break;\ + case 2: do BITUNPACK64_2( __ip, __op, __parm) while(__op<__ope); break;\ + case 3: do BITUNPACK64_3( __ip, __op, __parm) while(__op<__ope); break;\ + case 4: do BITUNPACK64_4( __ip, __op, __parm) while(__op<__ope); break;\ + case 5: do BITUNPACK64_5( __ip, __op, __parm) while(__op<__ope); break;\ + case 6: do BITUNPACK64_6( __ip, __op, __parm) while(__op<__ope); break;\ + case 7: do BITUNPACK64_7( __ip, __op, __parm) while(__op<__ope); break;\ + case 8: do BITUNPACK64_8( __ip, __op, __parm) while(__op<__ope); break;\ + case 9: do BITUNPACK64_9( __ip, __op, __parm) while(__op<__ope); break;\ + case 10: do BITUNPACK64_10(__ip, __op, __parm) while(__op<__ope); break;\ + case 11: do BITUNPACK64_11(__ip, __op, __parm) while(__op<__ope); break;\ + case 12: do BITUNPACK64_12(__ip, __op, __parm) while(__op<__ope); break;\ + case 13: do BITUNPACK64_13(__ip, __op, __parm) while(__op<__ope); break;\ + case 14: do BITUNPACK64_14(__ip, __op, __parm) while(__op<__ope); break;\ + case 15: do BITUNPACK64_15(__ip, __op, __parm) while(__op<__ope); break;\ + case 16: do BITUNPACK64_16(__ip, __op, __parm) while(__op<__ope); break;\ + case 17: do BITUNPACK64_17(__ip, __op, __parm) while(__op<__ope); break;\ + case 18: do BITUNPACK64_18(__ip, __op, __parm) while(__op<__ope); break;\ + case 19: do BITUNPACK64_19(__ip, __op, __parm) while(__op<__ope); break;\ + case 20: do BITUNPACK64_20(__ip, __op, __parm) while(__op<__ope); break;\ + case 21: do BITUNPACK64_21(__ip, __op, __parm) while(__op<__ope); break;\ + case 22: do BITUNPACK64_22(__ip, __op, __parm) while(__op<__ope); break;\ + case 23: do BITUNPACK64_23(__ip, __op, __parm) while(__op<__ope); break;\ + case 24: do BITUNPACK64_24(__ip, __op, __parm) while(__op<__ope); break;\ + case 25: do BITUNPACK64_25(__ip, __op, __parm) while(__op<__ope); break;\ + case 26: do BITUNPACK64_26(__ip, __op, __parm) while(__op<__ope); break;\ + case 27: do BITUNPACK64_27(__ip, __op, __parm) while(__op<__ope); break;\ + case 28: do BITUNPACK64_28(__ip, __op, __parm) while(__op<__ope); break;\ + case 29: do BITUNPACK64_29(__ip, __op, __parm) while(__op<__ope); break;\ + case 30: do BITUNPACK64_30(__ip, __op, __parm) while(__op<__ope); break;\ + case 31: do BITUNPACK64_31(__ip, __op, __parm) while(__op<__ope); break;\ + case 32: do BITUNPACK64_32(__ip, __op, __parm) while(__op<__ope); break;\ + }\ +} + #elif USE_BITUNPACK == 32 +#include "bitunpack32_.h" // Not included in the github package +#define BITUNPACK32(__ip, __n, __nbits, __op, __parm) { typeof(__op[0]) *__ope = __op + __n;\ + switch(__nbits) {\ + case 0: do BITUNPACK32_0( __ip, __op, __parm) while(__op<__ope); break;\ + case 1: do BITUNPACK32_1( __ip, __op, __parm) while(__op<__ope); break;\ + case 2: do BITUNPACK32_2( __ip, __op, __parm) while(__op<__ope); break;\ + case 3: do BITUNPACK32_3( __ip, __op, __parm) while(__op<__ope); break;\ + case 4: do BITUNPACK32_4( __ip, __op, __parm) while(__op<__ope); break;\ + case 5: do BITUNPACK32_5( __ip, __op, __parm) while(__op<__ope); break;\ + case 6: do BITUNPACK32_6( __ip, __op, __parm) while(__op<__ope); break;\ + case 7: do BITUNPACK32_7( __ip, __op, __parm) while(__op<__ope); break;\ + case 8: do BITUNPACK32_8( __ip, __op, __parm) while(__op<__ope); break;\ + case 9: do BITUNPACK32_9( __ip, __op, __parm) while(__op<__ope); break;\ + case 10: do BITUNPACK32_10(__ip, __op, __parm) while(__op<__ope); break;\ + case 11: do BITUNPACK32_11(__ip, __op, __parm) while(__op<__ope); break;\ + case 12: do BITUNPACK32_12(__ip, __op, __parm) while(__op<__ope); break;\ + case 13: do BITUNPACK32_13(__ip, __op, __parm) while(__op<__ope); break;\ + case 14: do BITUNPACK32_14(__ip, __op, __parm) while(__op<__ope); break;\ + case 15: do BITUNPACK32_15(__ip, __op, __parm) while(__op<__ope); break;\ + case 16: do BITUNPACK32_16(__ip, __op, __parm) while(__op<__ope); break;\ + case 17: do BITUNPACK32_17(__ip, __op, __parm) while(__op<__ope); break;\ + case 18: do BITUNPACK32_18(__ip, __op, __parm) while(__op<__ope); break;\ + case 19: do BITUNPACK32_19(__ip, __op, __parm) while(__op<__ope); break;\ + case 20: do BITUNPACK32_20(__ip, __op, __parm) while(__op<__ope); break;\ + case 21: do BITUNPACK32_21(__ip, __op, __parm) while(__op<__ope); break;\ + case 22: do BITUNPACK32_22(__ip, __op, __parm) while(__op<__ope); break;\ + case 23: do BITUNPACK32_23(__ip, __op, __parm) while(__op<__ope); break;\ + case 24: do BITUNPACK32_24(__ip, __op, __parm) while(__op<__ope); break;\ + case 25: do BITUNPACK32_25(__ip, __op, __parm) while(__op<__ope); break;\ + case 26: do BITUNPACK32_26(__ip, __op, __parm) while(__op<__ope); break;\ + case 27: do BITUNPACK32_27(__ip, __op, __parm) while(__op<__ope); break;\ + case 28: do BITUNPACK32_28(__ip, __op, __parm) while(__op<__ope); break;\ + case 29: do BITUNPACK32_29(__ip, __op, __parm) while(__op<__ope); break;\ + case 30: do BITUNPACK32_30(__ip, __op, __parm) while(__op<__ope); break;\ + case 31: do BITUNPACK32_31(__ip, __op, __parm) while(__op<__ope); break;\ + case 32: do BITUNPACK32_32(__ip, __op, __parm) while(__op<__ope); break;\ + }\ +} + #endif + #endif