diff options
author | Nick Terrell <terrelln@fb.com> | 2022-12-13 16:24:40 -0800 |
---|---|---|
committer | Nick Terrell <terrelln@fb.com> | 2022-12-13 16:24:40 -0800 |
commit | 70d822cfb782ebed5c41bdad9fa520b5ec1c6923 (patch) | |
tree | 50b71fef1b2eaca80a1ab159cfffb4e678c2278b /lib/zstd/common/bitstream.h | |
parent | 4f2c0a4acffbec01079c28f839422e64ddeff004 (diff) | |
parent | 2aa14b1ab2c41a4fe41efae80d58bb77da91f19f (diff) | |
download | linux-70d822cfb782ebed5c41bdad9fa520b5ec1c6923.tar.bz2 |
Merge branch 'zstd-next' into zstd-linus
Diffstat (limited to 'lib/zstd/common/bitstream.h')
-rw-r--r-- | lib/zstd/common/bitstream.h | 9 |
1 files changed, 9 insertions, 0 deletions
diff --git a/lib/zstd/common/bitstream.h b/lib/zstd/common/bitstream.h index 28248abe8612..feef3a1b1d60 100644 --- a/lib/zstd/common/bitstream.h +++ b/lib/zstd/common/bitstream.h @@ -313,7 +313,16 @@ MEM_STATIC FORCE_INLINE_ATTR size_t BIT_getMiddleBits(size_t bitContainer, U32 c U32 const regMask = sizeof(bitContainer)*8 - 1; /* if start > regMask, bitstream is corrupted, and result is undefined */ assert(nbBits < BIT_MASK_SIZE); + /* x86 transform & ((1 << nbBits) - 1) to bzhi instruction, it is better + * than accessing memory. When bmi2 instruction is not present, we consider + * such cpus old (pre-Haswell, 2013) and their performance is not of that + * importance. + */ +#if defined(__x86_64__) || defined(_M_X86) + return (bitContainer >> (start & regMask)) & ((((U64)1) << nbBits) - 1); +#else return (bitContainer >> (start & regMask)) & BIT_mask[nbBits]; +#endif } MEM_STATIC FORCE_INLINE_ATTR size_t BIT_getLowerBits(size_t bitContainer, U32 const nbBits) |