Tested on gcc-5.3.1, clang-3.8, icc-16.0.3 Reviewed-by: Tim Rowley <timothy.o.row...@intel.com> Tested-by: Tim Rowley <timothy.o.row...@intel.com>
> On Jun 28, 2016, at 2:50 PM, Chuck Atkins <chuck.atk...@kitware.com> wrote: > > Encapsulate the test for which flags are needed to get a compiler to > support certain features. Along with this, give various options to try > for AVX and AVX2 support. Ideally we want to use specific instruction > set feature flags, like -mavx2 for instance instead of -march=haswell, > but the flags required for certain compilers are different. This > allows, for AVX2 for instance, GCC to use -mavx2 -mfma -mbmi2 -mf16c > while the Intel compiler which doesn't support those flags can fall > back to using -march=core-avx2. > > This addresses a bug where the Intel compiler will silently ignore the > AVX2 instruction feature flags and then potentially fail to build. > > v2: Pass preprocessor-check argument as true-state instead of > false-state for clarity. > v3: Reduce AVX2 define test to just __AVX2__. Additional defines suchas > __FMA__, __BMI2__, and __F16C__ appear to be inconsistently defined > w.r.t thier availability. > v4: Fix C++11 flags being added globally and add more logic to > swr_require_cxx_feature_flags > > Cc: Tim Rowley <timothy.o.row...@intel.com> > Signed-off-by: Chuck Atkins <chuck.atk...@kitware.com> > --- > configure.ac | 73 +++++++++++++++++++++++++------------ > src/gallium/drivers/swr/Makefile.am | 4 +- > 2 files changed, 52 insertions(+), 25 deletions(-) > > diff --git a/configure.ac b/configure.ac > index cc9bc47..8321e8e 100644 > --- a/configure.ac > +++ b/configure.ac > @@ -2330,6 +2330,45 @@ swr_llvm_check() { > fi > } > > +swr_require_cxx_feature_flags() { > + feature_name="$1" > + preprocessor_test="$2" > + option_list="$3" > + output_var="$4" > + > + AC_MSG_CHECKING([whether $CXX supports $feature_name]) > + AC_LANG_PUSH([C++]) > + save_CXXFLAGS="$CXXFLAGS" > + save_IFS="$IFS" > + IFS="," > + found=0 > + for opts in $option_list > + do > + unset IFS > + CXXFLAGS="$opts $save_CXXFLAGS" > + AC_COMPILE_IFELSE( > + [AC_LANG_PROGRAM( > + [ #if !($preprocessor_test) > + #error > + #endif > + ])], > + [found=1; break], > + []) > + IFS="," > + done > + IFS="$save_IFS" > + CXXFLAGS="$save_CXXFLAGS" > + AC_LANG_POP([C++]) > + if test $found -eq 1; then > + AC_MSG_RESULT([$opts]) > + eval "$output_var=\$opts" > + return 0 > + fi > + AC_MSG_RESULT([no]) > + AC_MSG_ERROR([swr requires $feature_name support]) > + return 1 > +} > + > dnl Duplicates in GALLIUM_DRIVERS_DIRS are removed by sorting it after this > block > if test -n "$with_gallium_drivers"; then > gallium_drivers=`IFS=', '; echo $with_gallium_drivers` > @@ -2399,31 +2438,19 @@ if test -n "$with_gallium_drivers"; then > xswr) > swr_llvm_check "swr" > > - AC_MSG_CHECKING([whether $CXX supports c++11/AVX/AVX2]) > - SWR_AVX_CXXFLAGS="-mavx" > - SWR_AVX2_CXXFLAGS="-mavx2 -mfma -mbmi2 -mf16c" > - > - AC_LANG_PUSH([C++]) > - save_CXXFLAGS="$CXXFLAGS" > - CXXFLAGS="-std=c++11 $CXXFLAGS" > - AC_COMPILE_IFELSE([AC_LANG_PROGRAM()],[], > - [AC_MSG_ERROR([c++11 compiler support not > detected])]) > - CXXFLAGS="$save_CXXFLAGS" > - > - save_CXXFLAGS="$CXXFLAGS" > - CXXFLAGS="$SWR_AVX_CXXFLAGS $CXXFLAGS" > - AC_COMPILE_IFELSE([AC_LANG_PROGRAM()],[], > - [AC_MSG_ERROR([AVX compiler support not > detected])]) > - CXXFLAGS="$save_CXXFLAGS" > - > - save_CFLAGS="$CXXFLAGS" > - CXXFLAGS="$SWR_AVX2_CXXFLAGS $CXXFLAGS" > - AC_COMPILE_IFELSE([AC_LANG_PROGRAM()],[], > - [AC_MSG_ERROR([AVX2 compiler support not > detected])]) > - CXXFLAGS="$save_CXXFLAGS" > - AC_LANG_POP([C++]) > + swr_require_cxx_feature_flags "C++11" "__cplusplus >= 201103L" \ > + ",-std=c++11" \ > + SWR_CXX11_CXXFLAGS > + AC_SUBST([SWR_CXX11_CXXFLAGS]) > > + swr_require_cxx_feature_flags "AVX" "defined(__AVX__)" \ > + ",-mavx,-march=core-avx" \ > + SWR_AVX_CXXFLAGS > AC_SUBST([SWR_AVX_CXXFLAGS]) > + > + swr_require_cxx_feature_flags "AVX2" "defined(__AVX2__)" \ > + ",-mavx2 -mfma -mbmi2 -mf16c,-march=core-avx2" \ > + SWR_AVX2_CXXFLAGS > AC_SUBST([SWR_AVX2_CXXFLAGS]) > > HAVE_GALLIUM_SWR=yes > diff --git a/src/gallium/drivers/swr/Makefile.am > b/src/gallium/drivers/swr/Makefile.am > index d896154..210b203 100644 > --- a/src/gallium/drivers/swr/Makefile.am > +++ b/src/gallium/drivers/swr/Makefile.am > @@ -22,7 +22,7 @@ > include Makefile.sources > include $(top_srcdir)/src/gallium/Automake.inc > > -AM_CXXFLAGS = $(GALLIUM_DRIVER_CFLAGS) -std=c++11 > +AM_CXXFLAGS = $(GALLIUM_DRIVER_CFLAGS) $(SWR_CXX11_CXXFLAGS) > > noinst_LTLIBRARIES = libmesaswr.la > > @@ -31,7 +31,7 @@ libmesaswr_la_SOURCES = $(LOADER_SOURCES) > COMMON_CXXFLAGS = \ > $(GALLIUM_DRIVER_CFLAGS) \ > $(LLVM_CXXFLAGS) \ > - -std=c++11 \ > + $(SWR_CXX11_CXXFLAGS) \ > -I$(builddir)/rasterizer/scripts \ > -I$(builddir)/rasterizer/jitter \ > -I$(srcdir)/rasterizer \ > -- > 2.5.5 > _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev