@ -3,36 +3,55 @@
INCLUDE ( CheckCXXSourceRuns )
SET ( FIND_AVX_10 )
SET ( FIND_AVX_20 )
SET ( AVX_FLAGS )
SET ( AVX_FOUND )
# C h e c k A V X 2
SET ( CMAKE_REQUIRED_FLAGS )
IF ( CMAKE_COMPILER_IS_GNUCC OR CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang" )
SET ( CMAKE_REQUIRED_FLAGS "-mavx2" )
ELSEIF ( MSVC AND NOT CMAKE_CL_64 ) # r e s e r v e f o r W I N D O W S
SET ( CMAKE_REQUIRED_FLAGS "/arch:AVX2" )
set ( MMX_FLAG "-mmmx" )
set ( SSE2_FLAG "-msse2" )
set ( SSE3_FLAG "-msse3" )
SET ( AVX_FLAG "-mavx" )
SET ( AVX2_FLAG "-mavx2" )
ELSEIF ( MSVC )
set ( MMX_FLAG "/arch:MMX" )
set ( SSE2_FLAG "/arch:SSE2" )
set ( SSE3_FLAG "/arch:SSE3" )
SET ( AVX_FLAG "/arch:AVX" )
SET ( AVX2_FLAG "/arch:AVX2" )
ENDIF ( )
# C h e c k M M X
set ( CMAKE_REQUIRED_FLAGS ${ MMX_FLAG } )
CHECK_CXX_SOURCE_RUNS ( "
# i n c l u d e < i m m i n t r i n . h >
# i n c l u d e < mm i n t r i n . h >
i n t main ( )
{
_ _ m 2 5 6 i a = _mm256_set_epi32 ( -1, 2, -3, 4, -1, 2, -3, 4 ) ;
_ _ m 2 5 6 i r e s u l t = _mm256_abs_epi32 ( a ) ;
_mm_setzero_si64 ( ) ;
r e t u r n 0 ;
} " FI N D _ A V X _ 2 0 )
} " MM X _ F O U N D )
# C h e c k A V X
SET ( CMAKE_REQUIRED_FLAGS )
IF ( CMAKE_COMPILER_IS_GNUCC OR CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang" )
SET ( CMAKE_REQUIRED_FLAGS "-mavx" )
ELSEIF ( MSVC AND NOT CMAKE_CL_64 )
SET ( CMAKE_REQUIRED_FLAGS "/arch:AVX" )
endif ( )
# C h e c k S S E 2
set ( CMAKE_REQUIRED_FLAGS ${ SSE2_FLAG } )
CHECK_CXX_SOURCE_RUNS ( "
# i n c l u d e < e m m i n t r i n . h >
i n t main ( )
{
_mm_setzero_si128 ( ) ;
r e t u r n 0 ;
} " S S E 2 _ F O U N D )
# C h e c k S S E 3
set ( CMAKE_REQUIRED_FLAGS ${ SSE3_FLAG } )
CHECK_CXX_SOURCE_RUNS ( "
# i n c l u d e < p m m i n t r i n . h >
i n t main ( )
{
_ _ m 1 2 8 d a = _mm_set1_pd ( 6.28 ) ;
_ _ m 1 2 8 d b = _mm_set1_pd ( 3.14 ) ;
_ _ m 1 2 8 d r e s u l t = _mm_addsub_pd ( a, b ) ;
r e s u l t = _mm_movedup_pd ( result ) ;
r e t u r n 0 ;
} " S S E 3 _ F O U N D )
# C h e c k A V X
set ( CMAKE_REQUIRED_FLAGS ${ AVX_FLAG } )
CHECK_CXX_SOURCE_RUNS ( "
# i n c l u d e < i m m i n t r i n . h >
i n t main ( )
@ -41,25 +60,17 @@ int main()
_ _ m 2 5 6 b = _mm256_set_ps ( 1.0f, 2.0f, 3.0f, 4.0f, 1.0f, 2.0f, 3.0f, 4.0f ) ;
_ _ m 2 5 6 r e s u l t = _mm256_add_ps ( a, b ) ;
r e t u r n 0 ;
} " F I N D _ A V X _ 1 0 )
IF ( ${ FIND_AVX_20 } )
IF ( CMAKE_COMPILER_IS_GNUCC OR CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang" )
SET ( AVX_FLAGS "${AVX_FLAGS} -mavx2" )
ELSEIF ( MSVC )
SET ( AVX_FLAGS "${AVX_FLAGS} /arch:AVX2" )
ENDIF ( )
ENDIF ( )
} " A V X _ F O U N D )
IF ( ${ FIND_AVX_10 } )
IF ( CMAKE_COMPILER_IS_GNUCC OR CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang" )
SET ( AVX_FLAGS "${AVX_FLAGS} -mavx" )
ELSEIF ( MSVC )
SET ( AVX_FLAGS "${AVX_FLAGS} /arch:AVX" )
ENDIF ( )
ENDIF ( )
# C h e c k A V X 2
set ( CMAKE_REQUIRED_FLAGS ${ AVX2_FLAG } )
CHECK_CXX_SOURCE_RUNS ( "
# i n c l u d e < i m m i n t r i n . h >
i n t main ( )
{
_ _ m 2 5 6 i a = _mm256_set_epi32 ( -1, 2, -3, 4, -1, 2, -3, 4 ) ;
_ _ m 2 5 6 i r e s u l t = _mm256_abs_epi32 ( a ) ;
r e t u r n 0 ;
} " A V X 2 _ F O U N D )
IF ( ${ FIND_AVX_10 } )
SET ( AVX_FOUND TRUE )
MESSAGE ( STATUS "Find CPU supports ${AVX_FLAGS}." )
ENDIF ( )
mark_as_advanced ( MMX_FOUND SSE2_FOUND SSE3_FOUND AVX_FOUND AVX2_FOUND )