| INCLUDE(CheckCSourceCompiles) | |
| INCLUDE(CMakePushCheckState) | |
| FUNCTION (CHECK_FUSION_PREREQUISITES) | |
| MESSAGE(STATUS "Detecting fusion support") | |
| CMAKE_PUSH_CHECK_STATE() | |
| SET(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} -mavx2 -maes -mpclmul -mvaes -mvpclmulqdq") | |
| CHECK_C_SOURCE_COMPILES(" | |
| #include <emmintrin.h> | |
| #include <immintrin.h> | |
| int main(void) { | |
| __m256i ord0, ord1, ord2, ord3 = _mm256_setzero_si256(); | |
| ord0 = _mm256_aesenc_epi128(ord1, ord2); | |
| ord3 = _mm256_aesenclast_epi128(ord0, ord1); | |
| ord1 = _mm256_clmulepi64_epi128(ord3, ord2, 0x00); | |
| _mm_insert_epi64(_mm_setr_epi32(0, 1, 2, 3), 0, 0); | |
| return 0; | |
| } | |
| " CC_HAS_AESNI256) | |
| CMAKE_POP_CHECK_STATE() | |
| IF (CC_HAS_AESNI256) | |
| MESSAGE(STATUS "Can use fusion") | |
| SET(WITH_FUSION_DEFAULT "ON" PARENT_SCOPE) | |
| ELSE () | |
| MESSAGE(STATUS "Cannot use fusion") | |
| SET(WITH_FUSION_DEFAULT "OFF" PARENT_SCOPE) | |
| ENDIF () | |
| ENDFUNCTION () |