From: inikep Date: Tue, 5 Apr 2016 08:08:25 +0000 (+0200) Subject: experiments with ZSTD_decodeSequence X-Git-Tag: v0.6.0^2~17^2~16^2~8^2~2 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=b3532793a9532277ff660ce38822a5d13f168f9d;p=thirdparty%2Fzstd.git experiments with ZSTD_decodeSequence --- diff --git a/lib/zstd_decompress.c b/lib/zstd_decompress.c index 85ef9faf1..65d214a21 100644 --- a/lib/zstd_decompress.c +++ b/lib/zstd_decompress.c @@ -687,45 +687,59 @@ static void ZSTD_decodeSequence(seq_t* seq, seqState_t* seqState, const U32 mls) { size_t offset; - if (ofCode) { - offset = OF_base[ofCode] + BIT_readBits(&(seqState->DStream), ofBits); /* <= 26 bits */ - if (MEM_32bits()) BIT_reloadDStream(&(seqState->DStream)); - - } else { - offset = 0; - } - - if (offset < ZSTD_REP_NUM) { - if (llCode == 0 && offset <= 1) offset = 1-offset; - - if (offset != 0) { - size_t temp = seqState->prevOffset[offset]; - if (offset != 1) { - if (offset == 3) seqState->prevOffset[3] = seqState->prevOffset[2]; - seqState->prevOffset[2] = seqState->prevOffset[1]; - } +#if 0 + if (!ofCode) { + if (!llCode) { + offset = seqState->prevOffset[1]; seqState->prevOffset[1] = seqState->prevOffset[0]; - seqState->prevOffset[0] = offset = temp; + seqState->prevOffset[0] = offset; } else { offset = seqState->prevOffset[0]; } - } else { - offset -= ZSTD_REP_MOVE; -#if 1 // faster without kSlotNew - seqState->prevOffset[3] = seqState->prevOffset[2]; - seqState->prevOffset[2] = seqState->prevOffset[1]; - seqState->prevOffset[1] = seqState->prevOffset[0]; - seqState->prevOffset[0] = offset; + offset = OF_base[ofCode] + BIT_readBits(&(seqState->DStream), ofBits); /* <= 26 bits */ + if (MEM_32bits()) BIT_reloadDStream(&(seqState->DStream)); #else - if (kSlotNew < 3) seqState->prevOffset[3] = seqState->prevOffset[2]; - if (kSlotNew < 2) seqState->prevOffset[2] = seqState->prevOffset[1]; - if (kSlotNew < 1) seqState->prevOffset[1] = seqState->prevOffset[0]; - seqState->prevOffset[kSlotNew] = offset; -#endif + if (!ofCode) + offset = 0; + else { + offset = OF_base[ofCode] + BIT_readBits(&(seqState->DStream), ofBits); /* <= 26 bits */ + if (MEM_32bits()) BIT_reloadDStream(&(seqState->DStream)); } + { +#endif + if (offset < ZSTD_REP_NUM) { + if (llCode == 0 && offset <= 1) offset = 1-offset; + + if (offset != 0) { + size_t temp = seqState->prevOffset[offset]; + if (offset != 1) { + if (offset == 3) seqState->prevOffset[3] = seqState->prevOffset[2]; + seqState->prevOffset[2] = seqState->prevOffset[1]; + } + seqState->prevOffset[1] = seqState->prevOffset[0]; + seqState->prevOffset[0] = offset = temp; + + } else { + offset = seqState->prevOffset[0]; + } + } else { + offset -= ZSTD_REP_MOVE; + #if 1 // faster without kSlotNew + seqState->prevOffset[3] = seqState->prevOffset[2]; + seqState->prevOffset[2] = seqState->prevOffset[1]; + seqState->prevOffset[1] = seqState->prevOffset[0]; + seqState->prevOffset[0] = offset; + #else + if (kSlotNew < 3) seqState->prevOffset[3] = seqState->prevOffset[2]; + if (kSlotNew < 2) seqState->prevOffset[2] = seqState->prevOffset[1]; + if (kSlotNew < 1) seqState->prevOffset[1] = seqState->prevOffset[0]; + seqState->prevOffset[kSlotNew] = offset; + #endif + } + } seq->offset = offset; } diff --git a/lib/zstd_internal.h b/lib/zstd_internal.h index 1a527d51c..c3ad3e1c9 100644 --- a/lib/zstd_internal.h +++ b/lib/zstd_internal.h @@ -46,6 +46,17 @@ #define MIN(a,b) ((a)<(b) ? (a) : (b)) #define MAX(a,b) ((a)>(b) ? (a) : (b)) +#define ZSTD_GCC_VERSION (__GNUC__ * 100 + __GNUC_MINOR__) + +#if (ZSTD_GCC_VERSION >= 302) || (__INTEL_COMPILER >= 800) || defined(__clang__) +# define expect(expr,value) (__builtin_expect ((expr),(value)) ) +#else +# define expect(expr,value) (expr) +#endif + +#define likely(expr) expect((expr) != 0, 1) +#define unlikely(expr) expect((expr) != 0, 0) + /*-************************************* * Common constants