summaryrefslogtreecommitdiff
path: root/configure.ac
diff options
context:
space:
mode:
authorTomaž Vajngerl <tomaz.vajngerl@collabora.co.uk>2017-05-08 10:47:04 +0200
committerTomaž Vajngerl <quikee@gmail.com>2019-07-09 02:46:43 +0200
commitf43f9b99603736a4d54f550052509eb5f4d04b45 (patch)
tree96f8e17bc271471d54571d6ffce7146b6bcdb626 /configure.ac
parentf65905dd0ff464774f338db44d69925f98e1766c (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.ac102
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