summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJun He <jun.he@arm.com>2021-07-09 16:49:06 +0800
committerJun He <jun.he@arm.com>2021-08-12 15:45:41 +0800
commitab9a57280d7d56a76a9e9a2d860fe205eb45221f (patch)
tree7145e2b23bc135a6facbd77026fb62528729d6ae
parentf2db8f77ce469ce00e33657b981e41a1bd1daf16 (diff)
downloadsnappy-git-ab9a57280d7d56a76a9e9a2d860fe205eb45221f.tar.gz
Fix SSE3 and BMI2 compile error
After SHUFFLE code blocks are refactored, "tmmintrin.h" is missed, and bmi2 code part will have build failure as type conflicts. Signed-off-by: Jun He <jun.he@arm.com> Change-Id: I7800cd7e050f4d349e5a227206b14b9c566e547f
-rw-r--r--snappy-internal.h35
-rw-r--r--snappy.cc21
2 files changed, 33 insertions, 23 deletions
diff --git a/snappy-internal.h b/snappy-internal.h
index f1aafa9..71d19c0 100644
--- a/snappy-internal.h
+++ b/snappy-internal.h
@@ -33,13 +33,44 @@
#include "snappy-stubs-internal.h"
+#if !defined(SNAPPY_HAVE_BMI2)
+// __BMI2__ is defined by GCC and Clang. Visual Studio doesn't target BMI2
+// specifically, but it does define __AVX2__ when AVX2 support is available.
+// Fortunately, AVX2 was introduced in Haswell, just like BMI2.
+//
+// BMI2 is not defined as a subset of AVX2 (unlike SSSE3 and AVX above). So,
+// GCC and Clang can build code with AVX2 enabled but BMI2 disabled, in which
+// case issuing BMI2 instructions results in a compiler error.
+#if defined(__BMI2__) || (defined(_MSC_VER) && defined(__AVX2__))
+#define SNAPPY_HAVE_BMI2 1
+#else
+#define SNAPPY_HAVE_BMI2 0
+#endif
+#endif // !defined(SNAPPY_HAVE_BMI2)
+
+#if SNAPPY_HAVE_BMI2
+// Please do not replace with <x86intrin.h>. or with headers that assume more
+// advanced SSE versions without checking with all the OWNERS.
+#include <immintrin.h>
+#endif
+
+#if SNAPPY_HAVE_SSSE3
+#include <tmmintrin.h>
+#endif
+#if SNAPPY_HAVE_NEON
+#include <arm_neon.h>
+#endif
+
namespace snappy {
namespace internal {
+#if (SNAPPY_HAVE_SSSE3 || SNAPPY_HAVE_NEON)
+#define SNAPPY_HAVE_VECTOR_BYTE_SHUFFLE 1
+#endif
#if SNAPPY_HAVE_VECTOR_BYTE_SHUFFLE
#if SNAPPY_HAVE_SSSE3
using V128 = __m128i;
-#else
+#elif SNAPPY_HAVE_NEON
using V128 = uint8x16_t;
#endif
@@ -72,7 +103,7 @@ inline V128 V128_Shuffle(V128 input, V128 shuffle_mask) {
inline V128 V128_DupChar(char c) { return _mm_set1_epi8(c); }
-#else
+#elif SNAPPY_HAVE_NEON
inline V128 V128_Load(const V128* src) {
return vld1q_u8(reinterpret_cast<const uint8_t*>(src));
}
diff --git a/snappy.cc b/snappy.cc
index 3f446c6..3b0de12 100644
--- a/snappy.cc
+++ b/snappy.cc
@@ -30,27 +30,6 @@
#include "snappy-sinksource.h"
#include "snappy.h"
-#if !defined(SNAPPY_HAVE_BMI2)
-// __BMI2__ is defined by GCC and Clang. Visual Studio doesn't target BMI2
-// specifically, but it does define __AVX2__ when AVX2 support is available.
-// Fortunately, AVX2 was introduced in Haswell, just like BMI2.
-//
-// BMI2 is not defined as a subset of AVX2 (unlike SSSE3 and AVX above). So,
-// GCC and Clang can build code with AVX2 enabled but BMI2 disabled, in which
-// case issuing BMI2 instructions results in a compiler error.
-#if defined(__BMI2__) || (defined(_MSC_VER) && defined(__AVX2__))
-#define SNAPPY_HAVE_BMI2 1
-#else
-#define SNAPPY_HAVE_BMI2 0
-#endif
-#endif // !defined(SNAPPY_HAVE_BMI2)
-
-#if SNAPPY_HAVE_BMI2
-// Please do not replace with <x86intrin.h>. or with headers that assume more
-// advanced SSE versions without checking with all the OWNERS.
-#include <immintrin.h>
-#endif
-
#include <algorithm>
#include <array>
#include <cstddef>