From 46001f9856a867047fa552fd6579147bbf13fbe4 Mon Sep 17 00:00:00 2001 From: x Date: Fri, 10 Mar 2023 20:28:32 +0100 Subject: [PATCH] TurboPFor: TurboVByte - Variable byte --- vint.c | 148 ++++++++++++++++++++++++++++----------------------------- 1 file changed, 72 insertions(+), 76 deletions(-) diff --git a/vint.c b/vint.c index a6e46a1..7053e35 100644 --- a/vint.c +++ b/vint.c @@ -1,5 +1,5 @@ /** - Copyright (C) powturbo 2013-2019 + Copyright (C) powturbo 2013-2023 GPL v2 License This program is free software; you can redistribute it and/or modify @@ -21,19 +21,25 @@ - twitter : https://twitter.com/powturbo - email : powturbo [_AT_] gmail [_DOT_] com **/ -// vint.c - "Integer Compression" variable byte - #ifndef USIZE -#include -#include +// vint.c - "Integer Compression" variable byte + #ifndef USIZE #pragma warning( disable : 4005) #pragma warning( disable : 4090) #pragma warning( disable : 4068) -#define BITUTIL_IN -#define VINT_IN -#include "conf.h" -#include "vint.h" -#include "bitutil.h" +#include +#include +#include "include_/conf.h" +#include "include_/bitutil.h" +#include "include_/vint.h" +#define VB_MAX 0xfd // reserved : 0xfe=all zeros, 0xff=overflow +#include "include_/vlcbyte.h" + +#include "include_/bitutil_.h" + +//---------------------------------------------------------------- +#define OVERFLOWD(in,n,out) if(*in == 0xff) { memcpy(out, in+1, n*(USIZE/8)); return in+1+n*(USIZE/8); } +#define OVERFLOWE(in,n,out,op, _goto_) if(op+32 > out + (uint64_t)n*(USIZE/8)) { *out = 0xff; memcpy(out+1, in, n*(USIZE/8)); op = out+1+n*(USIZE/8); _goto_; } #define UN 8 // 4 // @@ -80,22 +86,17 @@ #define USIZE 8 #include "vint.c" #undef USIZE + #else -#define uint_t TEMPLATE3(uint, USIZE, _t) +#define uint_t T3(uint, USIZE, _t) #if VDELTA == 0 -//#if USIZE < 64 -#define OVERFLOWD(in,n,out,vbmax) if(*in == (vbmax)) { memcpy(out, in+1, n*(USIZE/8)); return in+1+n*(USIZE/8); } -#define OVERFLOWE(in,n,out,op,vbmax) if(op > out + n*(USIZE/8)) { *out = (vbmax); memcpy(out+1, in, n*(USIZE/8)); op = out+1+n*(USIZE/8); } -//#else -//#define OVERFLOWD(in,n,out,vbmax) -//#define OVERFLOWE(in,n,out,op,vbmax) -//#endif -unsigned char *TEMPLATE2(vbdec, USIZE)(unsigned char *__restrict in, unsigned n, uint_t *__restrict out) { - register uint_t x, *op; - OVERFLOWD(in, n, out, VB_MAX+1); - #define VBE(_i_) TEMPLATE2(_vbget, USIZE)(in, x, op[_i_] = x) +unsigned char *T2(vbdec, USIZE)(unsigned char *__restrict in, unsigned n, uint_t *__restrict out) { + register uint_t x, *op; + OVERFLOWD(in, n, out); + + #define VBE(_i_) T2(_vbget, USIZE)(in, x, op[_i_] = x) for(op = out; op != out+(n&~(UN-1)); op += UN) { VBE(0); VBE(1); VBE(2); VBE(3); #if UN > 4 @@ -104,16 +105,16 @@ unsigned char *TEMPLATE2(vbdec, USIZE)(unsigned char *__restrict in, unsigned n PREFETCH(in+16*USIZE, 0); } while(op != out+n) - TEMPLATE2(_vbget, USIZE)(in, x, *op++ = x ); + T2(_vbget, USIZE)(in, x, *op++ = x ); return in; } #undef VBE -unsigned char *TEMPLATE2(vbenc, USIZE)(uint_t *__restrict in, unsigned n, unsigned char *__restrict out) { +unsigned char *T2(vbenc, USIZE)(uint_t *__restrict in, unsigned n, unsigned char *__restrict out) { uint_t x, *ip; unsigned char *op = out; - #define VBD(_i_) x = ip[_i_]; TEMPLATE2(_vbput, USIZE)(op, x, ;); + #define VBD(_i_) x = ip[_i_]; T2(_vbput, USIZE)(op, x, ;); for(ip = in; ip != in+(n&~(UN-1)); ip += UN) { PREFETCH(ip+USIZE*8, 0); VBD(0); VBD(1); VBD(2); VBD(3); #if UN > 4 @@ -122,37 +123,37 @@ unsigned char *TEMPLATE2(vbenc, USIZE)(uint_t *__restrict in, unsigned n, unsign } while(ip != in+n) { x = *ip++; - TEMPLATE2(_vbput, USIZE)(op, x, ;); + T2(_vbput, USIZE)(op, x, ;); } - OVERFLOWE(in,n,out,op,VB_MAX+1); + OVERFLOWE(in,n,out,op,;); return op; } #undef VBD -uint_t TEMPLATE2(vbgetx, USIZE)(unsigned char *__restrict in, unsigned idx) { +uint_t T2(vbgetx, USIZE)(unsigned char *__restrict in, unsigned idx) { unsigned char *ip; unsigned i; uint_t x; if(*in == 255) - return TEMPLATE2(ctou, USIZE)(in+1+idx*(USIZE/8)); + return T2(ctou, USIZE)(in+1+idx*(USIZE/8)); for(ip = in,i = 0; i <= idx; i++) - ip += TEMPLATE2(_vbvlen, USIZE)(*ip); - TEMPLATE2(_vbget, USIZE)(in, x, ;); + ip += T2(vbvlen, USIZE)(*ip); + T2(_vbget, USIZE)(in, x, ;); return x; } -/*unsigned TEMPLATE2(vbgeteq, USIZE)(unsigned char *__restrict in, unsigned n, uint_t key, unsigned char **__restrict _ip) { +/*unsigned T2(vbgeteq, USIZE)(unsigned char *__restrict in, unsigned n, uint_t key, unsigned char **__restrict _ip) { unsigned i; unsigned char *ip; uint_t x; if(*in == 255) { for(ip = (*_ip==in)?in:*ip; ip < in+n; ip+USIZE/8) { - TEMPLATE2(_vbget, USIZE)(ip, x, ;); - if((x = TEMPLATE2(ctou, USIZE)(ip)) == key) break; + T2(_vbget, USIZE)(ip, x, ;); + if((x = T2(ctou, USIZE)(ip)) == key) break; } } else for(ip = *_ip,i=idx; i < n; i++) { - TEMPLATE2(_vbget, USIZE)(ip, x, ;); + T2(_vbget, USIZE)(ip, x, ;); if(x == key) break; } *_ip = ip; @@ -162,21 +163,21 @@ uint_t TEMPLATE2(vbgetx, USIZE)(unsigned char *__restrict in, unsigned idx) { #define BIT_SET( p, n) (p[(n)/BITS] |= (0x80>>((n)%BITS))) #define BIT_CLEAR(p, n) (p[(n)/BITS] &= ~(0x80>>((n)%BITS))) #define BIT_ISSET(p, n) (p[(n)/BITS] & (0x80>>((n)%BITS))) -unsigned char *TEMPLATE2(vbddenc, USIZE)(uint_t *__restrict in, unsigned n, unsigned char *__restrict out, uint_t start) { +unsigned char *T2(vbddenc, USIZE)(uint_t *__restrict in, unsigned n, unsigned char *__restrict out, uint_t start) { uint_t *ip,v,pd=0,*p; unsigned char *bp=out; out += (n+7)/8; #define VBDDE(i) { uint_t x; start = ip[i]-start; x = start-pd; pd = start; \ - if(!x) BIT_CLEAR(bp,i); else { BIT_SET(bp,i); x = TEMPLATE2(zigzagenc, USIZE)(x); TEMPLATE2(_vbput, USIZE)(out, x, ;); } start = ip[i]; } + if(!x) BIT_CLEAR(bp,i); else { BIT_SET(bp,i); x = T2(zigzagenc, USIZE)(x); T2(_vbput, USIZE)(out, x, ;); } start = ip[i]; } for(ip = in; ip != in+(n&~(8-1)); ip+=8,bp++) { VBDDE(0);VBDDE(1);VBDDE(2);VBDDE(3);VBDDE(4);VBDDE(5);VBDDE(6);VBDDE(7);} for(p=ip; p != in+n; p++) VBDDE(p-ip); return out; } -unsigned char *TEMPLATE2(vbdddec, USIZE)(unsigned char *__restrict in, unsigned n, uint_t *__restrict out, uint_t start) { +unsigned char *T2(vbdddec, USIZE)(unsigned char *__restrict in, unsigned n, uint_t *__restrict out, uint_t start) { uint_t *op,pd=0,*p; unsigned i; - #define VBDDD(i) { uint_t x=0; if(BIT_ISSET(bp,i)) { TEMPLATE2(_vbget, USIZE)(in, x, ;); pd += TEMPLATE2(zigzagdec, USIZE)(x); } op[i] = (start += pd); } + #define VBDDD(i) { uint_t x=0; if(BIT_ISSET(bp,i)) { T2(_vbget, USIZE)(in, x, ;); pd += T2(zigzagdec, USIZE)(x); } op[i] = (start += pd); } unsigned char *bp=in; in+=(n+7)/8; for(op = out; op != out+(n&~(8-1)); op+=8,bp++) { if(!bp[0]) { op[0]=(start+=pd); op[1]=(start+=pd); op[2]=(start+=pd); op[3]=(start+=pd); op[4]=(start+=pd); op[5]=(start+=pd); op[6]=(start+=pd); op[7]=(start+=pd); continue; } @@ -188,21 +189,21 @@ unsigned char *TEMPLATE2(vbdddec, USIZE)(unsigned char *__restrict in, unsigned #undef VBDDE #undef VBDDD -unsigned char *TEMPLATE2(vbzenc, USIZE)(uint_t *__restrict in, unsigned n, unsigned char *__restrict out, uint_t start) { +unsigned char *T2(vbzenc, USIZE)(uint_t *__restrict in, unsigned n, unsigned char *__restrict out, uint_t start) { uint_t *ip,v; unsigned char *op = out; - #define VBZE { v = TEMPLATE2(zigzagenc, USIZE)((TEMPLATE3(int, USIZE, _t))(*ip)-(TEMPLATE3(int, USIZE, _t))start); start=*ip++; TEMPLATE2(_vbput, USIZE)(op, v, ;); } + #define VBZE { v = T2(zigzagenc, USIZE)((T3(int, USIZE, _t))(*ip)-(T3(int, USIZE, _t))start); start=*ip++; T2(_vbput, USIZE)(op, v, ;); } for(ip = in; ip != in+(n&~(UN-1)); ) { VBZE;VBZE;VBZE;VBZE; } while(ip != in+n) VBZE; //OVERFLOWE(in,n,out,op); return op; } #undef VBZE -unsigned char *TEMPLATE2(vbzdec, USIZE)(unsigned char *__restrict in, unsigned n, uint_t *__restrict out, uint_t start) { +unsigned char *T2(vbzdec, USIZE)(unsigned char *__restrict in, unsigned n, uint_t *__restrict out, uint_t start) { uint_t x,*op; - #define VBZD { TEMPLATE2(_vbget, USIZE)(in, x, ;); *op++ = (start += TEMPLATE2(zigzagdec, USIZE)(x)); } + #define VBZD { T2(_vbget, USIZE)(in, x, ;); *op++ = (start += T2(zigzagdec, USIZE)(x)); } for(op = out; op != out+(n&~(UN-1)); ) { VBZD; VBZD; VBZD; VBZD; #if UN > 4 VBZD; VBZD; VBZD; VBZD; @@ -215,24 +216,24 @@ unsigned char *TEMPLATE2(vbzdec, USIZE)(unsigned char *__restrict in, unsigned n } #undef VBZD -uint_t TEMPLATE2(vbzgetx, USIZE)(unsigned char *__restrict in, unsigned idx, uint_t start) { +uint_t T2(vbzgetx, USIZE)(unsigned char *__restrict in, unsigned idx, uint_t start) { unsigned char *ip; unsigned i; uint_t x; for(ip = in,i = 0; i <= idx; i++) { - TEMPLATE2(_vbget, USIZE)(ip, x, ;); + T2(_vbget, USIZE)(ip, x, ;); start += x+VDELTA; } return start; } -unsigned TEMPLATE2(vbzgeteq, USIZE)(unsigned char **__restrict in, unsigned n, unsigned idx, uint_t key, uint_t start ) { +unsigned T2(vbzgeteq, USIZE)(unsigned char **__restrict in, unsigned n, unsigned idx, uint_t key, uint_t start ) { unsigned i; unsigned char *ip; uint_t x; for(ip = *in,i=idx; i < n; i++) { - TEMPLATE2(_vbget, USIZE)(ip, x, ;); + T2(_vbget, USIZE)(ip, x, ;); if((start += x+VDELTA) == key) break; } @@ -240,21 +241,21 @@ unsigned TEMPLATE2(vbzgeteq, USIZE)(unsigned char **__restrict in, unsigned n, u return i; } -unsigned char *TEMPLATE2(vbxenc, USIZE)(uint_t *__restrict in, unsigned n, unsigned char *__restrict out, uint_t start) { +unsigned char *T2(vbxenc, USIZE)(uint_t *__restrict in, unsigned n, unsigned char *__restrict out, uint_t start) { uint_t *ip,v; unsigned char *op = out; - #define VBXE { v = (*ip)^start; start=*ip++; TEMPLATE2(_vbput, USIZE)(op, v, ;); } + #define VBXE { v = (*ip)^start; start=*ip++; T2(_vbput, USIZE)(op, v, ;); } for(ip = in; ip != in+(n&~(UN-1)); ) { VBXE;VBXE;VBXE;VBXE; } while(ip != in+n) VBXE; //OVERFLOWE(in,n,out,op); return op; } #undef VBZE -unsigned char *TEMPLATE2(vbxdec, USIZE)(unsigned char *__restrict in, unsigned n, uint_t *__restrict out, uint_t start) { +unsigned char *T2(vbxdec, USIZE)(unsigned char *__restrict in, unsigned n, uint_t *__restrict out, uint_t start) { uint_t x,*op; - #define VBXD { TEMPLATE2(_vbget, USIZE)(in, x, ;); *op++ = (start ^= x); } + #define VBXD { T2(_vbget, USIZE)(in, x, ;); *op++ = (start ^= x); } for(op = out; op != out+(n&~(UN-1)); ) { VBXD; VBXD; VBXD; VBXD; #if UN > 4 VBXD; VBXD; VBXD; VBXD; @@ -267,24 +268,24 @@ unsigned char *TEMPLATE2(vbxdec, USIZE)(unsigned char *__restrict in, unsigned n } #undef VBZD -uint_t TEMPLATE2(vbxgetx, USIZE)(unsigned char *__restrict in, unsigned idx, uint_t start) { +uint_t T2(vbxgetx, USIZE)(unsigned char *__restrict in, unsigned idx, uint_t start) { unsigned char *ip; unsigned i; uint_t x; for(ip = in,i = 0; i <= idx; i++) { - TEMPLATE2(_vbget, USIZE)(ip, x, ;); + T2(_vbget, USIZE)(ip, x, ;); start ^= x; } return start; } -unsigned TEMPLATE2(vbxgeteq, USIZE)(unsigned char **__restrict in, unsigned n, unsigned idx, uint_t key, uint_t start ) { +unsigned T2(vbxgeteq, USIZE)(unsigned char **__restrict in, unsigned n, unsigned idx, uint_t key, uint_t start ) { unsigned i; unsigned char *ip; uint_t x; for(ip = *in,i=idx; i < n; i++) { - TEMPLATE2(_vbget, USIZE)(ip, x, ;); + T2(_vbget, USIZE)(ip, x, ;); if((start ^= x) == key) break; } @@ -293,45 +294,40 @@ unsigned TEMPLATE2(vbxgeteq, USIZE)(unsigned char **__restrict in, unsigned n, u } #endif -unsigned char *TEMPLATE2(VBDENC, USIZE)(uint_t *__restrict in, unsigned n, unsigned char *__restrict out, uint_t start) { +unsigned char *T2(VBDENC, USIZE)(uint_t *__restrict in, unsigned n, unsigned char *__restrict out, uint_t start) { unsigned char *op = out; uint_t *ip, b = 0,v; if(!n) return out; - #if USIZE == 64 - #define VB_MX 255 - #else - #define VB_MX VB_MAX - #endif - #define VBDE { v = ip[0]-start-VDELTA; start = *ip++; TEMPLATE2(_vbput, USIZE)(op, v, ;); b |= (v /*^ x*/); } + #define VBDE { v = ip[0]-start-VDELTA; start = *ip++; T2(_vbput, USIZE)(op, v, ;); b |= (v /*^ x*/); } for(ip = in; ip != in + (n&~(UN-1)); ) { VBDE; VBDE; VBDE; VBDE; #if UN > 4 VBDE; VBDE; VBDE; VBDE; #endif } while(ip != in+n) VBDE; - if(!b) { op = out; *op++ = VB_MX; } // if (x) { op = out; *op++ = VB_MAX-2; TEMPLATE2(_vbput, USIZE)(op, x, ;); } + if(!b) { op = out; *op++ = 0xfe; } // if (x) { op = out; *op++ = VB_MAX-2; T2(_vbput, USIZE)(op, x, ;); } #if USIZE < 64 - OVERFLOWE(in,n,out,op,VB_MAX-1); + OVERFLOWE(in,n,out,op, ;); #endif return op; } #undef VBDE -unsigned char *TEMPLATE2(VBDDEC, USIZE)(unsigned char *__restrict in, unsigned n, uint_t *__restrict out, uint_t start) { +unsigned char *T2(VBDDEC, USIZE)(unsigned char *__restrict in, unsigned n, uint_t *__restrict out, uint_t start) { uint_t x,*op; if(!n) return in; #if USIZE < 64 - OVERFLOWD(in,n,out,VB_MAX-1); + OVERFLOWD(in,n,out); #endif - if(in[0] == VB_MX) { + if(in[0] == 0xfe) { in++; #if (defined(__SSE2__) || defined(__ARM_NEON)) && USIZE == 32 #if VDELTA == 0 - if(n) TEMPLATE2(BITZERO, USIZE)(out, n, start); + if(n) T2(BITZERO, USIZE)(out, n, start); #else - if(n) TEMPLATE2(BITDIZERO,USIZE)(out, n, start, VDELTA); + if(n) T2(BITDIZERO,USIZE)(out, n, start, VDELTA); #endif #else #if VDELTA == 0 @@ -343,9 +339,9 @@ unsigned char *TEMPLATE2(VBDDEC, USIZE)(unsigned char *__restrict in, unsigned n return in; } #if 0 //USIZE < 64 - else if(in[0] == VB_MAX-2) { in++; + else if(in[0] == 0xfe) { in++; uint_t z; - TEMPLATE2(_vbget, USIZE)(in, z, ;); + T2(_vbget, USIZE)(in, z, ;); #if VDELTA == 0 for(x = 0; x < n; x++) out[x] = start+z; #else @@ -354,7 +350,7 @@ unsigned char *TEMPLATE2(VBDDEC, USIZE)(unsigned char *__restrict in, unsigned n return in; } #endif - #define VBDD(i) { TEMPLATE2(_vbget, USIZE)(in, x, x+=VDELTA); op[i] = (start += x); } + #define VBDD(i) { T2(_vbget, USIZE)(in, x, x+=VDELTA); op[i] = (start += x); } for(op = out; op != out+(n&~(UN-1)); op+=UN) { VBDD(0); VBDD(1); VBDD(2); VBDD(3); #if UN > 4 @@ -367,7 +363,7 @@ unsigned char *TEMPLATE2(VBDDEC, USIZE)(unsigned char *__restrict in, unsigned n } #undef VBDD -uint_t TEMPLATE2(VBDGETX, USIZE)(unsigned char *__restrict in, unsigned idx, uint_t start) { +uint_t T2(VBDGETX, USIZE)(unsigned char *__restrict in, unsigned idx, uint_t start) { unsigned char *ip; unsigned i=0; uint_t x; @@ -378,13 +374,13 @@ uint_t TEMPLATE2(VBDGETX, USIZE)(unsigned char *__restrict in, unsigned idx, ui if(u & 1) return start + VDELTA; #endif for(ip = in; i <= idx; i++) { - TEMPLATE2(_vbget, USIZE)(ip, x, ;); + T2(_vbget, USIZE)(ip, x, ;); start += x+VDELTA; } return start; } -unsigned TEMPLATE2(VBDGETGEQ, USIZE)(unsigned char **__restrict in, unsigned n, unsigned idx, uint_t *key, uint_t start ) { +unsigned T2(VBDGETGEQ, USIZE)(unsigned char **__restrict in, unsigned n, unsigned idx, uint_t *key, uint_t start ) { unsigned i=0; unsigned char *ip=*in; uint_t x; @@ -396,7 +392,7 @@ unsigned TEMPLATE2(VBDGETGEQ, USIZE)(unsigned char **__restrict in, unsigned n, } #endif for(ip = *in; i < n; i++) { - TEMPLATE2(_vbget, USIZE)(ip, x, ;); + T2(_vbget, USIZE)(ip, x, ;); if((start += x+VDELTA) == *key) break; }