]> git.ipfire.org Git - thirdparty/zstd.git/commitdiff
Enable STATIC_BMI2 for gcc/clang 3080/head
authorIlya Tokar <tokarip@google.com>
Tue, 1 Mar 2022 23:49:10 +0000 (18:49 -0500)
committerIlya Tokar <tokarip@google.com>
Thu, 3 Mar 2022 20:03:54 +0000 (15:03 -0500)
Some usage (e.g. BIT_getLowerBit) uses it without checking for MSVC,
so enabling for clang gives a small performance boost.

lib/common/bitstream.h
lib/common/compiler.h

index 43a2216780588a0058c807d91761b4f9ebcf5f5d..731630ea44b79b77032aa4be72d10cd0c612d8cd 100644 (file)
@@ -37,8 +37,8 @@ extern "C" {
 *  Target specific
 =========================================*/
 #ifndef ZSTD_NO_INTRINSICS
-#  if defined(__BMI__) && defined(__GNUC__)
-#    include <immintrin.h>   /* support for bextr (experimental) */
+#  if (defined(__BMI__) || defined(__BMI2__)) && defined(__GNUC__)
+#    include <immintrin.h>   /* support for bextr (experimental)/bzhi */
 #  elif defined(__ICCARM__)
 #    include <intrinsics.h>
 #  endif
@@ -164,8 +164,8 @@ MEM_STATIC size_t BIT_initCStream(BIT_CStream_t* bitC,
 
 MEM_STATIC FORCE_INLINE_ATTR size_t BIT_getLowerBits(size_t bitContainer, U32 const nbBits)
 {
-#if defined(STATIC_BMI2) && STATIC_BMI2 == 1
-       return  _bzhi_u64(bitContainer, nbBits);
+#if defined(STATIC_BMI2) && STATIC_BMI2 == 1 && !defined(ZSTD_NO_INTRINSICS)
+    return  _bzhi_u64(bitContainer, nbBits);
 #else
     assert(nbBits < BIT_MASK_SIZE);
     return bitContainer & BIT_mask[nbBits];
index 516930c01ec9c6bfce854085fa914faa75757282..6c7100e835a3f7eb8c5fb02871969780fed4fb05 100644 (file)
 #    ifdef __AVX2__  //MSVC does not have a BMI2 specific flag, but every CPU that supports AVX2 also supports BMI2
 #       define STATIC_BMI2 1
 #    endif
+#  elif defined(__BMI2__) && defined(__x86_64__) && defined(__GNUC__)
+#    define STATIC_BMI2 1
 #  endif
 #endif