summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVictor Costan <pwnall@chromium.org>2021-08-30 01:36:24 +0000
committerVictor Costan <pwnall@chromium.org>2021-08-30 01:36:24 +0000
commit7062d7f1d8a5ca7ade075579f36681ff48616dc3 (patch)
treeb5647299c3f6cae4183ca702948b7973f0834c08
parentcbb83a1d64a5505c6fe8d505641109e405358a7d (diff)
parent734b32bfe3d85675652964d09b59eff33a00f557 (diff)
downloadsnappy-git-7062d7f1d8a5ca7ade075579f36681ff48616dc3.tar.gz
Merge pull request #133 from JunHe77:simd
PiperOrigin-RevId: 393681630
-rw-r--r--CMakeLists.txt9
-rw-r--r--cmake/config.h.in3
-rw-r--r--snappy-internal.h21
3 files changed, 31 insertions, 2 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 672561e..6eef485 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -178,6 +178,15 @@ int main() {
return _bzhi_u32(0, 1);
}" SNAPPY_HAVE_BMI2)
+check_cxx_source_compiles("
+#include <arm_neon.h>
+int main() {
+ uint8_t val = 3, dup[8];
+ uint8x16_t v = vld1q_dup_u8(&val);
+ vst1q_u8(dup, v);
+ return 0;
+}" SNAPPY_HAVE_NEON)
+
include(CheckSymbolExists)
check_symbol_exists("mmap" "sys/mman.h" HAVE_FUNC_MMAP)
check_symbol_exists("sysconf" "unistd.h" HAVE_FUNC_SYSCONF)
diff --git a/cmake/config.h.in b/cmake/config.h.in
index 306c7e2..5ea2b5a 100644
--- a/cmake/config.h.in
+++ b/cmake/config.h.in
@@ -49,6 +49,9 @@
/* Define to 1 if you target processors with BMI2+ and have <bmi2intrin.h>. */
#cmakedefine01 SNAPPY_HAVE_BMI2
+/* Define to 1 if you target processors with NEON and have <arm_neon.h>. */
+#cmakedefine01 SNAPPY_HAVE_NEON
+
/* Define to 1 if your processor stores words with the most significant byte
first (like Motorola and SPARC, unlike Intel and VAX). */
#cmakedefine01 SNAPPY_IS_BIG_ENDIAN
diff --git a/snappy-internal.h b/snappy-internal.h
index 8530071..ae7ab5a 100644
--- a/snappy-internal.h
+++ b/snappy-internal.h
@@ -33,13 +33,30 @@
#include "snappy-stubs-internal.h"
+#if SNAPPY_HAVE_SSSE3
+// Please do not replace with <x86intrin.h> or with headers that assume more
+// advanced SSE versions without checking with all the OWNERS.
+#include <emmintrin.h>
+#include <tmmintrin.h>
+#endif
+
+#if SNAPPY_HAVE_NEON
+#include <arm_neon.h>
+#endif
+
+#if SNAPPY_HAVE_SSSE3 || SNAPPY_HAVE_NEON
+#define SNAPPY_HAVE_VECTOR_BYTE_SHUFFLE 1
+#else
+#define SNAPPY_HAVE_VECTOR_BYTE_SHUFFLE 0
+#endif
+
namespace snappy {
namespace internal {
#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 +89,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));
}