@@ -49,6 +49,8 @@ option(SNAPPY_REQUIRE_AVX "Target processors with AVX support." OFF)
4949
5050option (SNAPPY_REQUIRE_AVX2 "Target processors with AVX2 support." OFF )
5151
52+ option (SNAPPY_REQUIRE_RVV "Target processors with RVV support." OFF )
53+
5254option (SNAPPY_INSTALL "Install Snappy's header and library" ON )
5355
5456include (TestBigEndian )
@@ -63,6 +65,8 @@ check_include_file("sys/time.h" HAVE_SYS_TIME_H)
6365check_include_file ("sys/uio.h" HAVE_SYS_UIO_H )
6466check_include_file ("unistd.h" HAVE_UNISTD_H )
6567check_include_file ("windows.h" HAVE_WINDOWS_H )
68+ check_include_file ("sse2rvv.h" HAVE_SSE2RISCV_INSTRINSIC_H )
69+ check_include_file ("riscv_vector.h" HAVE_RISCV_INSTRINSIC_H )
6670
6771include (CheckLibraryExists )
6872check_library_exists (z zlibVersion "" HAVE_LIBZ )
@@ -73,6 +77,7 @@ CHECK_CXX_COMPILER_FLAG("/arch:AVX" HAVE_VISUAL_STUDIO_ARCH_AVX)
7377CHECK_CXX_COMPILER_FLAG ("/arch:AVX2" HAVE_VISUAL_STUDIO_ARCH_AVX2 )
7478CHECK_CXX_COMPILER_FLAG ("-mavx" HAVE_CLANG_MAVX )
7579CHECK_CXX_COMPILER_FLAG ("-mbmi2" HAVE_CLANG_MBMI2 )
80+ CHECK_CXX_COMPILER_FLAG ("-march=rv64gcv" HAVE_CLANG_RVV )
7681if (SNAPPY_REQUIRE_AVX2)
7782 if (HAVE_VISUAL_STUDIO_ARCH_AVX2)
7883 set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /arch:AVX2" )
@@ -90,6 +95,10 @@ elseif (SNAPPY_REQUIRE_AVX)
9095 if (HAVE_CLANG_MAVX)
9196 set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mavx" )
9297 endif (HAVE_CLANG_MAVX )
98+ elseif (SNAPPY_REQUIRE_RVV)
99+ if (HAVE_CLANG_RVV)
100+ set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -march=rv64gcv" )
101+ endif (HAVE_CLANG_RVV )
93102endif (SNAPPY_REQUIRE_AVX2 )
94103
95104include (CheckCXXSourceCompiles )
@@ -115,6 +124,42 @@ int main() {
115124 return 0;
116125}" SNAPPY_HAVE_SSSE3 )
117126
127+ check_cxx_source_compiles ("
128+ #include <riscv_vector.h>
129+
130+ #define vreinterpretq_f64_m128i(x) \
131+ __riscv_vreinterpret_v_i64m1_i32m1(__riscv_vreinterpret_v_f64m1_i64m1(x))
132+ #define vreinterpretq_m128i_i64(x) __riscv_vreinterpret_v_i32m1_i64m1(x)
133+ #define vreinterpretq_i64_m128i(x) __riscv_vreinterpret_v_i64m1_i32m1(x)
134+ #define vreinterpretq_m128i_i8(x) __riscv_vreinterpret_v_i32m1_i8m1(x)
135+ #define vreinterpretq_i8_m128i(x) __riscv_vreinterpret_v_i8m1_i32m1(x)
136+
137+ int main() {
138+ const vint32m1_t *src = 0;
139+ vint32m1_t dest;
140+ const vint32m1_t shuffle_mask = vreinterpretq_f64_m128i(
141+ __riscv_vle64_v_f64m1((double const *)src, 2));
142+
143+ vint64m1_t addr = vreinterpretq_m128i_i64(*src);
144+ vint64m1_t zeros = __riscv_vmv_v_x_i64m1(0, 2);
145+
146+ vint32m1_t a = vreinterpretq_i64_m128i(
147+ __riscv_vslideup_vx_i64m1_tu(addr, zeros, 1, 2));
148+
149+ vint8m1_t _a = vreinterpretq_m128i_i8(a);
150+ vint8m1_t _b = vreinterpretq_m128i_i8(shuffle_mask);
151+ vbool8_t mask_lt_zero = __riscv_vmslt_vx_i8m1_b8(_b, 0, 16);
152+ vuint8m1_t idxs =
153+ __riscv_vreinterpret_v_i8m1_u8m1(__riscv_vand_vx_i8m1(_b, 0xf, 16));
154+ vint8m1_t shuffle = __riscv_vrgather_vv_i8m1(_a, idxs, 16);
155+
156+ const vint32m1_t pattern = vreinterpretq_i8_m128i(
157+ __riscv_vmerge_vxm_i8m1(shuffle, 0, mask_lt_zero, 16));
158+
159+ dest = pattern;
160+ return 0;
161+ }" SNAPPY_HAVE_RVV )
162+
118163check_cxx_source_compiles ("
119164#include <immintrin.h>
120165int main() {
0 commit comments