From: Yann Collet Date: Wed, 23 Mar 2016 17:45:23 +0000 (+0100) Subject: Added BMI instructions X-Git-Tag: v0.6.0^2~17^2~28^2~19 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=862a85976f84f0d6b2ef0f4ae21e0975d2ca3af4;p=thirdparty%2Fzstd.git Added BMI instructions --- diff --git a/lib/bitstream.h b/lib/bitstream.h index 62d2cb2ba..749dc02f0 100644 --- a/lib/bitstream.h +++ b/lib/bitstream.h @@ -292,9 +292,14 @@ MEM_STATIC size_t BIT_getUpperBits(size_t bitD, U32 const start) return bitD >> start; } +#include MEM_STATIC size_t BIT_getMiddleBits(size_t bitD, U32 const nbBits, U32 const start) { +#if defined(__BMI__) && defined(__GNUC__) + return __builtin_ia32_bextr_u64(bitD, (nbBits<<8) | start ); +#else return (bitD >> start) & BIT_mask[nbBits]; +#endif } MEM_STATIC size_t BIT_getLowerBits(size_t bitD, U32 const nbBits) @@ -309,10 +314,15 @@ MEM_STATIC size_t BIT_getLowerBits(size_t bitD, U32 const nbBits) * On 64-bits, maxNbBits==56. * @return : value extracted */ -MEM_STATIC size_t BIT_lookBits(const BIT_DStream_t* bitD, U32 nbBits) + MEM_STATIC size_t BIT_lookBits(const BIT_DStream_t* bitD, U32 nbBits) { +#if defined(__BMI__) && defined(__GNUC__) + return __builtin_ia32_bextr_u64(bitD->bitContainer, (nbBits<<8) | (64 - bitD->bitsConsumed - nbBits) ); +#else U32 const bitMask = sizeof(bitD->bitContainer)*8 - 1; return ((bitD->bitContainer << (bitD->bitsConsumed & bitMask)) >> 1) >> ((bitMask-nbBits) & bitMask); + //return (bitD->bitContainer >> (64 - bitD->bitsConsumed - nbBits)) & BIT_mask[nbBits]; +#endif } /*! BIT_lookBitsFast() :