diff options
author | Vsevolod Stakhov <vsevolod@highsecure.ru> | 2019-11-18 13:01:36 +0000 |
---|---|---|
committer | Vsevolod Stakhov <vsevolod@highsecure.ru> | 2019-11-18 13:01:36 +0000 |
commit | 7f482c08cef8b8e7817d2154ee46aa2569f28e30 (patch) | |
tree | ba913fe7cf6cf4abe36b681364d0ea4eb676749d /cmake/ArchDep.cmake | |
parent | 617c1bd77dfb532fe47bd27e58a1202d744b0af1 (diff) | |
download | rspamd-7f482c08cef8b8e7817d2154ee46aa2569f28e30.tar.gz rspamd-7f482c08cef8b8e7817d2154ee46aa2569f28e30.zip |
[Rework] Make cmake structure more modular
Diffstat (limited to 'cmake/ArchDep.cmake')
-rw-r--r-- | cmake/ArchDep.cmake | 106 |
1 files changed, 106 insertions, 0 deletions
diff --git a/cmake/ArchDep.cmake b/cmake/ArchDep.cmake new file mode 100644 index 000000000..e070da6b1 --- /dev/null +++ b/cmake/ArchDep.cmake @@ -0,0 +1,106 @@ +TARGET_ARCHITECTURE(ARCH) + +SET(ASM_CODE " + .macro TEST1 op + \\op %eax, %eax + .endm + TEST1 xorl + ") +ASM_OP(HAVE_SLASHMACRO "slash macro convention") + +SET(ASM_CODE " + .macro TEST1 op + $0 %eax, %eax + .endm + TEST1 xorl + ") +ASM_OP(HAVE_DOLLARMACRO "dollar macro convention") + +# For now we support only x86_64 architecture with optimizations +IF("${ARCH}" STREQUAL "x86_64") + IF(NOT HAVE_SLASHMACRO AND NOT HAVE_DOLLARMACRO) + MESSAGE(FATAL_ERROR "Your assembler cannot compile macros, please check your CMakeFiles/CMakeError.log") + ENDIF() + + SET(ASM_CODE "vpaddq %ymm0, %ymm0, %ymm0") + ASM_OP(HAVE_AVX2 "avx2") + # Handle broken compilers, sigh... + IF(HAVE_AVX2) + CHECK_C_SOURCE_COMPILES( + " +#include <stddef.h> +#pragma GCC push_options +#pragma GCC target(\"avx2\") +#ifndef __SSE2__ +#define __SSE2__ +#endif +#ifndef __SSE__ +#define __SSE__ +#endif +#ifndef __SSE4_2__ +#define __SSE4_2__ +#endif +#ifndef __SSE4_1__ +#define __SSE4_1__ +#endif +#ifndef __SSEE3__ +#define __SSEE3__ +#endif +#ifndef __AVX__ +#define __AVX__ +#endif +#ifndef __AVX2__ +#define __AVX2__ +#endif + +#ifndef __clang__ +#if __GNUC__ < 6 +#error Broken due to compiler bug +#endif +#endif + +#include <immintrin.h> +static void foo(const char* a) __attribute__((__target__(\"avx2\"))); +static void foo(const char* a) +{ + __m256i str = _mm256_loadu_si256((__m256i *)a); + __m256i t = _mm256_loadu_si256((__m256i *)a + 1); + _mm256_add_epi8(str, t); +} +int main(int argc, char** argv) { + foo(argv[0]); +}" HAVE_AVX2_C_COMPILER) + IF(NOT HAVE_AVX2_C_COMPILER) + MESSAGE(STATUS "Your compiler has broken AVX2 support") + UNSET(HAVE_AVX2 CACHE) + ENDIF() + ENDIF() + SET(ASM_CODE "vpaddq %xmm0, %xmm0, %xmm0") + ASM_OP(HAVE_AVX "avx") + SET(ASM_CODE "pmuludq %xmm0, %xmm0") + ASM_OP(HAVE_SSE2 "sse2") + SET(ASM_CODE "lddqu 0(%esi), %xmm0") + ASM_OP(HAVE_SSE3 "sse3") + SET(ASM_CODE "pshufb %xmm0, %xmm0") + ASM_OP(HAVE_SSSE3 "ssse3") + SET(ASM_CODE "pblendw \$0, %xmm0, %xmm0") + ASM_OP(HAVE_SSE41 "sse41") + SET(ASM_CODE "crc32 %eax, %eax") + ASM_OP(HAVE_SSE42 "sse42") +ENDIF() + +IF (NOT "${ARCH}" STREQUAL "x86_64") + MESSAGE(STATUS "Hyperscan support is possible only for x86_64 architecture") + SET(ENABLE_HYPERSCAN "OFF") +ENDIF() + +IF ("${ARCH}" STREQUAL "x86_64") + MESSAGE(STATUS "Enable sse2 on x86_64 architecture") + IF((CMAKE_C_COMPILER_ID MATCHES "GNU") OR (CMAKE_C_COMPILER_ID MATCHES "Clang")) + ADD_COMPILE_OPTIONS(-msse2) + ELSEIF(CMAKE_C_COMPILER_ID MATCHES "Intel") + ADD_COMPILE_OPTIONS(/QxSSE2) + ELSEIF((CMAKE_C_COMPILER_ID MATCHES "MSVC")) + ADD_COMPILE_OPTIONS(/arch:SSE2) + ENDIF() +ENDIF()
\ No newline at end of file |