You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

CMakeLists.txt 3.2KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. INCLUDE(AsmOp)
  2. TARGET_ARCHITECTURE(ARCH)
  3. SET(CHACHASRC ${CMAKE_CURRENT_SOURCE_DIR}/chacha20/chacha.c
  4. ${CMAKE_CURRENT_SOURCE_DIR}/chacha20/ref.c)
  5. SET(BASE64SRC ${CMAKE_CURRENT_SOURCE_DIR}/base64/ref.c
  6. ${CMAKE_CURRENT_SOURCE_DIR}/base64/base64.c)
  7. SET(ASM_CODE "
  8. .macro TEST1 op
  9. \\op %eax, %eax
  10. .endm
  11. TEST1 xorl
  12. ")
  13. ASM_OP(HAVE_SLASHMACRO "slash macro convention")
  14. SET(ASM_CODE "
  15. .macro TEST1 op
  16. $0 %eax, %eax
  17. .endm
  18. TEST1 xorl
  19. ")
  20. ASM_OP(HAVE_DOLLARMACRO "dollar macro convention")
  21. # For now we support only x86_64 architecture with optimizations
  22. IF("${ARCH}" STREQUAL "x86_64")
  23. IF(NOT HAVE_SLASHMACRO AND NOT HAVE_DOLLARMACRO)
  24. MESSAGE(FATAL_ERROR "Your assembler cannot compile macros, please check your CMakeFiles/CMakeError.log")
  25. ENDIF()
  26. SET(ASM_CODE "vpaddq %ymm0, %ymm0, %ymm0")
  27. ASM_OP(HAVE_AVX2 "avx2")
  28. # Handle broken compilers, sigh...
  29. IF(HAVE_AVX2)
  30. CHECK_C_SOURCE_COMPILES(
  31. "
  32. #include <stddef.h>
  33. #pragma GCC push_options
  34. #pragma GCC target(\"avx2\")
  35. #ifndef __SSE2__
  36. #define __SSE2__
  37. #endif
  38. #ifndef __SSE__
  39. #define __SSE__
  40. #endif
  41. #ifndef __SSE4_2__
  42. #define __SSE4_2__
  43. #endif
  44. #ifndef __SSE4_1__
  45. #define __SSE4_1__
  46. #endif
  47. #ifndef __SSEE3__
  48. #define __SSEE3__
  49. #endif
  50. #ifndef __AVX__
  51. #define __AVX__
  52. #endif
  53. #ifndef __AVX2__
  54. #define __AVX2__
  55. #endif
  56. #ifndef __clang__
  57. #if __GNUC__ < 6
  58. #error Broken due to compiler bug
  59. #endif
  60. #endif
  61. #include <immintrin.h>
  62. static void foo(const char* a) __attribute__((__target__(\"avx2\")));
  63. static void foo(const char* a)
  64. {
  65. __m256i str = _mm256_loadu_si256((__m256i *)a);
  66. __m256i t = _mm256_loadu_si256((__m256i *)a + 1);
  67. _mm256_add_epi8(str, t);
  68. }
  69. int main(int argc, char** argv) {
  70. foo(argv[0]);
  71. }" HAVE_AVX2_C_COMPILER)
  72. IF(NOT HAVE_AVX2_C_COMPILER)
  73. MESSAGE(STATUS "Your compiler has broken AVX2 support")
  74. UNSET(HAVE_AVX2 CACHE)
  75. ENDIF()
  76. ENDIF()
  77. SET(ASM_CODE "vpaddq %xmm0, %xmm0, %xmm0")
  78. ASM_OP(HAVE_AVX "avx")
  79. SET(ASM_CODE "pmuludq %xmm0, %xmm0")
  80. ASM_OP(HAVE_SSE2 "sse2")
  81. SET(ASM_CODE "lddqu 0(%esi), %xmm0")
  82. ASM_OP(HAVE_SSE3 "sse3")
  83. SET(ASM_CODE "pshufb %xmm0, %xmm0")
  84. ASM_OP(HAVE_SSSE3 "ssse3")
  85. SET(ASM_CODE "pblendw \$0, %xmm0, %xmm0")
  86. ASM_OP(HAVE_SSE41 "sse41")
  87. SET(ASM_CODE "crc32 %eax, %eax")
  88. ASM_OP(HAVE_SSE42 "sse42")
  89. ENDIF()
  90. IF(HAVE_AVX2)
  91. SET(CHACHASRC ${CHACHASRC} ${CMAKE_CURRENT_SOURCE_DIR}/chacha20/avx2.S)
  92. SET(BASE64SRC ${BASE64SRC} ${CMAKE_CURRENT_SOURCE_DIR}/base64/avx2.c)
  93. MESSAGE(STATUS "AVX2 support is added")
  94. ENDIF(HAVE_AVX2)
  95. IF(HAVE_AVX)
  96. SET(CHACHASRC ${CHACHASRC} ${CMAKE_CURRENT_SOURCE_DIR}/chacha20/avx.S)
  97. MESSAGE(STATUS "AVX support is added")
  98. ENDIF(HAVE_AVX)
  99. IF(HAVE_SSE2)
  100. SET(CHACHASRC ${CHACHASRC} ${CMAKE_CURRENT_SOURCE_DIR}/chacha20/sse2.S)
  101. MESSAGE(STATUS "SSE2 support is added")
  102. ENDIF(HAVE_SSE2)
  103. IF(HAVE_SSE42)
  104. SET(BASE64SRC ${BASE64SRC} ${CMAKE_CURRENT_SOURCE_DIR}/base64/sse42.c)
  105. MESSAGE(STATUS "SSE42 support is added")
  106. ENDIF(HAVE_SSE42)
  107. CONFIGURE_FILE(platform_config.h.in platform_config.h)
  108. INCLUDE_DIRECTORIES("${CMAKE_CURRENT_BINARY_DIR}")
  109. SET(LIBCRYPTOBOXSRC ${CMAKE_CURRENT_SOURCE_DIR}/cryptobox.c
  110. ${CMAKE_CURRENT_SOURCE_DIR}/keypair.c
  111. ${CMAKE_CURRENT_SOURCE_DIR}/keypairs_cache.c
  112. ${CMAKE_CURRENT_SOURCE_DIR}/catena/catena.c)
  113. SET(RSPAMD_CRYPTOBOX ${LIBCRYPTOBOXSRC} ${CHACHASRC} ${BASE64SRC} PARENT_SCOPE)