diff options
author | Tomaž Vajngerl <tomaz.vajngerl@collabora.co.uk> | 2017-05-08 10:47:04 +0200 |
---|---|---|
committer | Tomaž Vajngerl <quikee@gmail.com> | 2019-07-09 02:46:43 +0200 |
commit | f43f9b99603736a4d54f550052509eb5f4d04b45 (patch) | |
tree | 96f8e17bc271471d54571d6ffce7146b6bcdb626 /configure.ac | |
parent | f65905dd0ff464774f338db44d69925f98e1766c (diff) |
CPU intrinsics detection (SSE, AVX)
Adds CPU intrinsics detection in configure pass for compile time
detection and "cpuid" runtime detection of which CPU instruction
sets are available on the user device.
Change-Id: I0ee4d0b22a7c51f72796d43e7383a31d03b437ad
Reviewed-on: https://gerrit.libreoffice.org/75175
Tested-by: Jenkins
Reviewed-by: Tomaž Vajngerl <quikee@gmail.com>
Diffstat (limited to 'configure.ac')
-rw-r--r-- | configure.ac | 102 |
1 files changed, 102 insertions, 0 deletions
diff --git a/configure.ac b/configure.ac index ba079753729f..b9785d895366 100644 --- a/configure.ac +++ b/configure.ac @@ -6748,6 +6748,108 @@ fi AC_SUBST([HAVE_BROKEN_GCC_WMAYBE_UNINITIALIZED]) dnl =================================================================== +dnl CPU Intrinsincs support - SSE, AVX +dnl =================================================================== + +INTRINSICS_CXXFLAGS="" + +if test "$GCC" = "yes"; then + AC_MSG_CHECKING([whether $CXX can compile SSE2 intrinsics]) + AC_LANG_PUSH([C++]) + save_CXXFLAGS=$CXXFLAGS + CXXFLAGS="$CXXFLAGS -msse2" + AC_COMPILE_IFELSE([AC_LANG_SOURCE([ + #include <x86intrin.h> + int main () { + volatile __m128i a = _mm_set1_epi32 (0), b = _mm_set1_epi32 (0), c; + c = _mm_xor_si128 (a, b); + return 0; + } + ])], + [can_compile_sse2=yes], + [can_compile_sse2=no]) + AC_LANG_POP([C++]) + CXXFLAGS=$save_CXXFLAGS + AC_MSG_RESULT([${can_compile_sse2}]) + if test "${can_compile_sse2}" = "yes" ; then + INTRINSICS_CXXFLAGS="-msse2" + else + AC_MSG_WARN([cannot compile SSE2 intrinsics]) + fi + + AC_MSG_CHECKING([whether $CXX can compile SSSE3 intrinsics]) + AC_LANG_PUSH([C++]) + save_CXXFLAGS=$CXXFLAGS + CXXFLAGS="$CXXFLAGS -mssse3" + AC_COMPILE_IFELSE([AC_LANG_SOURCE([ + #include <x86intrin.h> + int main () { + volatile __m128i a = _mm_set1_epi32 (0), b = _mm_set1_epi32 (0), c; + c = _mm_maddubs_epi16 (a, b); + return 0; + } + ])], + [can_compile_ssse3=yes], + [can_compile_ssse3=no]) + AC_LANG_POP([C++]) + CXXFLAGS=$save_CXXFLAGS + AC_MSG_RESULT([${can_compile_ssse3}]) + if test "${can_compile_ssse3}" = "yes" ; then + INTRINSICS_CXXFLAGS="-mssse3" + else + AC_MSG_WARN([cannot compile SSSE3 intrinsics]) + fi + + AC_MSG_CHECKING([whether $CXX can compile AVX intrinsics]) + AC_LANG_PUSH([C++]) + save_CXXFLAGS=$CXXFLAGS + CXXFLAGS="$CXXFLAGS -mavx" + AC_COMPILE_IFELSE([AC_LANG_SOURCE([ + #include <x86intrin.h> + int main () { + volatile __m256 a = _mm256_set1_ps (0.0f), b = _mm256_set1_ps (0.0f), c; + c = _mm256_xor_ps(a, b); + return 0; + } + ])], + [can_compile_avx=yes], + [can_compile_avx=no]) + AC_LANG_POP([C++]) + CXXFLAGS=$save_CXXFLAGS + AC_MSG_RESULT([${can_compile_avx}]) + if test "${can_compile_avx}" = "yes" ; then + INTRINSICS_CXXFLAGS="-mavx" + else + AC_MSG_WARN([cannot compile AVX intrinsics]) + fi + + AC_MSG_CHECKING([whether $CXX can compile AVX2 intrinsics]) + AC_LANG_PUSH([C++]) + save_CXXFLAGS=$CXXFLAGS + CXXFLAGS="$CXXFLAGS -mavx2" + AC_COMPILE_IFELSE([AC_LANG_SOURCE([ + #include <x86intrin.h> + int main () { + volatile __m256i a = _mm256_set1_epi32 (0), b = _mm256_set1_epi32 (0), c; + c = _mm256_maddubs_epi16(a, b); + return 0; + } + ])], + [can_compile_avx2=yes], + [can_compile_avx2=no]) + AC_LANG_POP([C++]) + CXXFLAGS=$save_CXXFLAGS + AC_MSG_RESULT([${can_compile_avx2}]) + if test "${can_compile_avx2}" = "yes" ; then + INTRINSICS_CXXFLAGS="-mavx2" + else + AC_MSG_WARN([cannot compile AVX2 intrinsics]) + fi +fi + +AC_SUBST([INTRINSICS_CXXFLAGS]) + +dnl =================================================================== dnl system stl sanity tests dnl =================================================================== if test "$_os" != "WINNT"; then |