summaryrefslogtreecommitdiffstats
path: root/lib/zstd/common/bitstream.h
diff options
context:
space:
mode:
authorNick Terrell <terrelln@fb.com>2022-12-13 16:24:40 -0800
committerNick Terrell <terrelln@fb.com>2022-12-13 16:24:40 -0800
commit70d822cfb782ebed5c41bdad9fa520b5ec1c6923 (patch)
tree50b71fef1b2eaca80a1ab159cfffb4e678c2278b /lib/zstd/common/bitstream.h
parent4f2c0a4acffbec01079c28f839422e64ddeff004 (diff)
parent2aa14b1ab2c41a4fe41efae80d58bb77da91f19f (diff)
downloadlinux-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.h9
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)