# Check if SSE/AVX instructions are available on the machine where
# the project is compiled.

if(CMAKE_SYSTEM_NAME MATCHES "Linux")
   exec_program(cat ARGS "/proc/cpuinfo" OUTPUT_VARIABLE CPUINFO)

   string(REGEX REPLACE "^.*(sse2).*$" "\\1" SSE_THERE ${CPUINFO})
   string(COMPARE EQUAL "sse2" "${SSE_THERE}" SSE2_TRUE)
   if(SSE2_TRUE)
      set(SSE2_FOUND true CACHE BOOL "SSE2 available on host")
   else()
      set(SSE2_FOUND false CACHE BOOL "SSE2 available on host")
   endif()

   string(REGEX REPLACE "^.*(avx2).*$" "\\1" SSE_THERE ${CPUINFO})
   string(COMPARE EQUAL "avx2" "${SSE_THERE}" AVX2_TRUE)
   if(AVX2_TRUE)
      set(AVX2_FOUND true CACHE BOOL "AVX2 available on host")
   else()
      set(AVX2_FOUND false CACHE BOOL "AVX2 available on host")
   endif()

elseif(CMAKE_SYSTEM_NAME MATCHES "Darwin")
   exec_program("/usr/sbin/sysctl -a | grep machdep.cpu.features" OUTPUT_VARIABLE CPUINFO)
   string(REGEX REPLACE "^.*[^S](SSE2).*$" "\\1" SSE_THERE ${CPUINFO})
   string(COMPARE EQUAL "SSE2" "${SSE_THERE}" SSE2_TRUE)
   if(SSE2_TRUE)
      set(SSE2_FOUND true CACHE BOOL "SSE2 available on host")
   else()
      set(SSE2_FOUND false CACHE BOOL "SSE2 available on host")
   endif()

   exec_program("/usr/sbin/sysctl -a | grep machdep.cpu.leaf7_features" OUTPUT_VARIABLE CPUINFO)
   string(REGEX REPLACE "^.*(AVX2).*$" "\\1" SSE_THERE ${CPUINFO})
   string(COMPARE EQUAL "AVX2" "${SSE_THERE}" AVX2_TRUE)
   if(AVX2_TRUE)
      set(AVX2_FOUND true CACHE BOOL "AVX2 available on host")
   else()
      set(AVX2_FOUND false CACHE BOOL "AVX2 available on host")
   endif()

elseif(CMAKE_SYSTEM_NAME MATCHES "Windows")
   # TODO.  For now supposing SSE2 is safe enough
   set(SSE2_FOUND true  CACHE BOOL "SSE2 available on host")
   set(AVX2_FOUND false CACHE BOOL "AVX2 available on host")
else()
   set(SSE2_FOUND true  CACHE BOOL "SSE2 available on host")
   set(AVX2_FOUND false CACHE BOOL "AVX2 available on host")
endif()

if(NOT SSE2_FOUND)
   message(STATUS "Could not find hardware support for SSE2 on this machine.")
endif()
if(NOT AVX2_FOUND)
   message(STATUS "Could not find hardware support for AVX2 on this machine.")
endif()

mark_as_advanced(SSE2_FOUND AVX2_FOUND)
