diff options
author | Victor Costan <pwnall@chromium.org> | 2021-08-30 01:36:24 +0000 |
---|---|---|
committer | Victor Costan <pwnall@chromium.org> | 2021-08-30 01:36:24 +0000 |
commit | 7062d7f1d8a5ca7ade075579f36681ff48616dc3 (patch) | |
tree | b5647299c3f6cae4183ca702948b7973f0834c08 | |
parent | cbb83a1d64a5505c6fe8d505641109e405358a7d (diff) | |
parent | 734b32bfe3d85675652964d09b59eff33a00f557 (diff) | |
download | snappy-git-7062d7f1d8a5ca7ade075579f36681ff48616dc3.tar.gz |
Merge pull request #133 from JunHe77:simd
PiperOrigin-RevId: 393681630
-rw-r--r-- | CMakeLists.txt | 9 | ||||
-rw-r--r-- | cmake/config.h.in | 3 | ||||
-rw-r--r-- | snappy-internal.h | 21 |
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)); } |