diff --git a/TurboPFor-Integer-Compression/lib/ext/fastpfor.cc b/TurboPFor-Integer-Compression/lib/ext/fastpfor.cc new file mode 100644 index 0000000..9d7ef55 --- /dev/null +++ b/TurboPFor-Integer-Compression/lib/ext/fastpfor.cc @@ -0,0 +1,121 @@ +#if defined(_MSC_VER) && _MSC_VER < 1600 +#include "../vs/stdint.h" +#else +#include +#endif + +#include "fastpfor.h" +#include "FastPFor/headers/variablebyte.h" +#include "FastPFor/headers/simple16.h" +//#include "FastPFor/headers/simple8b_rle.h" +#include "FastPFor/headers/fastpfor.h" + +#include "FastPFor/headers/simdfastpfor.h" +#include "FastPFor/headers/optpfor.h" +#include "FastPFor/headers/simdoptpfor.h" +#include "FastPFor/headers/simdgroupsimple.h" +#include "FastPFor/headers/compositecodec.h" + +#define ctou32(_cp_) (*(unsigned *)(_cp_)) + +unsigned FastPFore32(const uint32_t *in, unsigned n, unsigned char *out, unsigned outsize) { + size_t nvalue = outsize/4; + FastPForLib::FastPFor<4> ic; + ic.encodeArray((const uint32_t *)in, n & (~127), (uint32_t *)(out+4), nvalue); + if(n & 127) { + size_t nvalue2 = outsize/4 - nvalue; + FastPForLib::VariableByte vc; + vc.encodeArray((const uint32_t *)(in + (n & (~127))), n & 127, (uint32_t *)(out + 4 + nvalue*4), nvalue2); + nvalue += nvalue2; + } + ctou32(out) = nvalue; + return 4+nvalue*4; +} + +unsigned FastPFord32(const unsigned char *in, unsigned n, uint32_t *out) { + size_t nvalue = n; + FastPForLib::FastPFor<4> ic; + const uint32_t *ip = ic.decodeArray((const uint32_t *)(in+4), ctou32(in), out, nvalue); + if(n & 127) { + nvalue = n - nvalue; + FastPForLib::VariableByte vc; + ip = vc.decodeArray(ip, (const uint32_t *)in+1+ctou32(in) - ip, out + (n&(~127)), nvalue); + } + return ctou32(ip); +} + +/*unsigned FastPFore64(const uint64_t *in, unsigned n, unsigned char *out, unsigned outsize) { + size_t nvalue = outsize/8; + FastPForLib::FastPFor<4> ic; + ic.encodeArray(in, (size_t)(n & (~127)), (uint32_t *)(out+4), nvalue); + if(n & 127) { + size_t nvalue2 = outsize/8 - nvalue; + FastPForLib::VariableByte vc; + + vc.encodeArray((const uint64_t *)(in + (n & (~127))), n & 127, (uint32_t *)(out + 4 + nvalue*4), nvalue2); + nvalue += nvalue2; + } + ctou32(out) = nvalue; + return 4+nvalue*4; +} + +unsigned FastPFord64(const unsigned char *in, unsigned n, uint64_t *out) { + size_t nvalue = n; + FastPForLib::FastPFor<4> ic; + const uint32_t *ip = ic.decodeArray((const uint32_t *)(in+4), ctou32(in), (uint64_t *)out, nvalue); + if(n & 127) { + nvalue = n - nvalue; + FastPForLib::VariableByte vc; + ip = vc.decodeArray(ip, (const uint32_t *)in+1+ctou32(in) - ip, out + (n&(~127)), nvalue); + } + return ctou32(ip); +}*/ + +unsigned FastPFore128v32(const uint32_t *in, unsigned n, unsigned char *out, unsigned outsize) { + size_t nvalue = outsize/4; + FastPForLib::SIMDFastPFor<4> ic; + ic.encodeArray(in, n & (~127), (uint32_t *)(out+4), nvalue); + if(n & 127) { + size_t nvalue2 = outsize/4 - nvalue; + FastPForLib::VariableByte vc; vc.encodeArray((const uint32_t *)(in + (n & (~127))), n & 127, (uint32_t *)(out + 4 + nvalue*4), nvalue2); + nvalue += nvalue2; + } + ctou32(out) = nvalue; + return 4+nvalue*4; +} + +unsigned FastPFord128v32(const unsigned char *in, unsigned n, uint32_t *out) { + size_t nvalue = n; + FastPForLib::SIMDFastPFor<4> ic; + const uint32_t *ip = ic.decodeArray((const uint32_t *)(in+4), *(uint32_t *)in, out, nvalue); + if(n & 127) { + nvalue = n - nvalue; + FastPForLib::VariableByte vc; + ip = vc.decodeArray(ip, (const uint32_t *)in+1+ctou32(in) - ip, out + (n&(~127)), nvalue); //return vbdec32((unsigned char *)ip, n & 127, out + mynvalue1); + } + return (unsigned char *)ip - (unsigned char *)in; +} + +unsigned OptPFore128v32(const uint32_t *in, unsigned n, unsigned char *out, unsigned outsize) { + size_t nvalue = outsize/4; + FastPForLib::SIMDOPTPFor<4> ic; ic.encodeArray((const uint32_t *)in, n & (~127), (uint32_t *)(out+4), nvalue); + if(n & 127) { + size_t nvalue2 = outsize/4 - nvalue; + FastPForLib::VariableByte vc; vc.encodeArray((const uint32_t *)(in + (n & (~127))), n & 127, (uint32_t *)(out + 4 + nvalue*4), nvalue2); + nvalue += nvalue2; + } + ctou32(out) = nvalue; + return 4+nvalue*4; +} + +unsigned OptPFord128v32(const unsigned char *in, unsigned n, uint32_t *out) { + size_t nvalue = n; + FastPForLib::SIMDOPTPFor<4> ic; + const uint32_t *ip = ic.decodeArray((const uint32_t *)(in+4), ctou32(in), out, nvalue); + if(n & 127) { + nvalue = n - nvalue; + FastPForLib::VariableByte vc; + ip = vc.decodeArray(ip, (const uint32_t *)in+1+ctou32(in) - ip, out + (n&(~127)), nvalue); //return vbdec32((unsigned char *)ip, n & 127, out + mynvalue1); + } + return (unsigned char *)ip-in; +}