INCLUDE(CheckCSourceRuns) INCLUDE(CheckCXXSourceRuns) SET(SSE1_CODE " #include int main() { __m128 a; float vals[4] = {0,0,0,0}; a = _mm_loadu_ps(vals); return 0; }") SET(SSE2_CODE " #include int main() { __m128d a; double vals[2] = {0,0}; a = _mm_loadu_pd(vals); return 0; }") SET(SSE3_CODE " #include int main( ) { const int vals[4] = {0,0,0,0}; __m128i a; a = _mm_lddqu_si128( (const __m128i*)vals ); return 0; }") SET(SSE4_1_CODE " #include int main () { __m128i a, b; __m128i res = _mm_max_epi8(a, b); return 0; } ") SET(SSE4_2_CODE " #include int main() { __m128i a, b, c; c = _mm_cmpgt_epi64(a, b); return 0; } ") MACRO(CHECK_SSE lang type flags) SET(__FLAG_I 1) SET(CMAKE_REQUIRED_FLAGS_SAVE ${CMAKE_REQUIRED_FLAGS}) FOREACH(__FLAG ${flags}) IF(NOT ${lang}_${type}_FOUND) SET(CMAKE_REQUIRED_FLAGS ${__FLAG}) IF(lang STREQUAL "CXX") CHECK_CXX_SOURCE_RUNS("${${type}_CODE}" ${lang}_HAS_${type}_${__FLAG_I}) ELSE() CHECK_C_SOURCE_RUNS("${${type}_CODE}" ${lang}_HAS_${type}_${__FLAG_I}) ENDIF() IF(${lang}_HAS_${type}_${__FLAG_I}) SET(${lang}_${type}_FOUND TRUE CACHE BOOL "${lang} ${type} support") SET(${lang}_${type}_FLAGS "${__FLAG}" CACHE STRING "${lang} ${type} flags") ENDIF() MATH(EXPR __FLAG_I "${__FLAG_I}+1") ENDIF() ENDFOREACH() SET(CMAKE_REQUIRED_FLAGS ${CMAKE_REQUIRED_FLAGS_SAVE}) IF(NOT ${lang}_${type}_FOUND) SET(${lang}_${type}_FOUND FALSE CACHE BOOL "${lang} ${type} support") SET(${lang}_${type}_FLAGS "" CACHE STRING "${lang} ${type} flags") ENDIF() MARK_AS_ADVANCED(${lang}_${type}_FOUND ${lang}_${type}_FLAGS) ENDMACRO() CHECK_SSE(C "SSE1" " ;-msse;/arch:SSE") CHECK_SSE(C "SSE2" " ;-msse2;/arch:SSE2") CHECK_SSE(C "SSE3" " ;-msse3;/arch:SSE3") CHECK_SSE(C "SSE4_1" " ;-msse4.1;-msse4;/arch:SSE4") CHECK_SSE(C "SSE4_2" " ;-msse4.2;-msse4;/arch:SSE4") CHECK_SSE(CXX "SSE1" " ;-msse;/arch:SSE") CHECK_SSE(CXX "SSE2" " ;-msse2;/arch:SSE2") CHECK_SSE(CXX "SSE3" " ;-msse3;/arch:SSE3") CHECK_SSE(CXX "SSE4_1" " ;-msse4.1;-msse4;/arch:SSE4") CHECK_SSE(CXX "SSE4_2" " ;-msse4.2;-msse4;/arch:SSE4")