From: "Dr. David Alan Gilbert" <dgilb...@redhat.com> Use the avx2 primitives during the test, thus making sure that the compiler and assembler could actually use avx2.
This also detects the failure case on gcc 4.8.x with -save-temps and avoids the need for the gcc version check in cutils. Signed-off-by: Dr. David Alan Gilbert <dgilb...@redhat.com> --- configure | 15 +++++++++++---- util/cutils.c | 8 +------- 2 files changed, 12 insertions(+), 11 deletions(-) diff --git a/configure b/configure index 5693c60..6449e65 100755 --- a/configure +++ b/configure @@ -1781,12 +1781,19 @@ fi # avx2 optimization requirement check cat > $TMPC << EOF -static void bar(void) {} +#pragma GCC push_options +#pragma GCC target("avx2") +#include <cpuid.h> +#include <immintrin.h> + +static int bar(void *a) { + return _mm256_movemask_epi8(_mm256_cmpeq_epi8(*(__m256i *)a, (__m256i){0})); +} static void *bar_ifunc(void) {return (void*) bar;} -void foo(void) __attribute__((ifunc("bar_ifunc"))); -int main(void) { foo(); return 0; } +int foo(void *a) __attribute__((ifunc("bar_ifunc"))); +int main(int argc, char *argv[]) { return foo(argv[0]);} EOF -if compile_prog "-mavx2" "" ; then +if compile_prog "" ; then if readelf --syms $TMPE |grep "IFUNC.*foo" >/dev/null 2>&1; then avx2_opt="yes" fi diff --git a/util/cutils.c b/util/cutils.c index 43d1afb..5830a68 100644 --- a/util/cutils.c +++ b/util/cutils.c @@ -256,13 +256,7 @@ static size_t buffer_find_nonzero_offset_inner(const void *buf, size_t len) return i * sizeof(VECTYPE); } -/* - * GCC before version 4.9 has a bug which will cause the target - * attribute work incorrectly and failed to compile in some case, - * restrict the gcc version to 4.9+ to prevent the failure. - */ - -#if defined CONFIG_AVX2_OPT && QEMU_GNUC_PREREQ(4, 9) +#if defined CONFIG_AVX2_OPT #pragma GCC push_options #pragma GCC target("avx2") #include <cpuid.h> -- 2.7.4