diff --git a/config.tests/x86_simd/main.cpp b/config.tests/x86_simd/main.cpp index 0e7ebed8d9..29c8b97c12 100644 --- a/config.tests/x86_simd/main.cpp +++ b/config.tests/x86_simd/main.cpp @@ -161,9 +161,6 @@ attribute_target("sha") void test_shani() #endif #if T(AVX) -# if defined(__WIN64__) && defined(__GNUC__) && !defined(__clang__) -# error "AVX support is broken in 64-bit MinGW - https://gcc.gnu.org/bugzilla/show_bug.cgi?id=49001" -# endif attribute_target("avx") void test_avx() { __m256d a = _mm256_setzero_pd(); diff --git a/src/corelib/global/qsimd_p.h b/src/corelib/global/qsimd_p.h index fdf5529135..57ef30d567 100644 --- a/src/corelib/global/qsimd_p.h +++ b/src/corelib/global/qsimd_p.h @@ -190,6 +190,29 @@ # define __SSE__ 1 # endif +# if defined(Q_OS_WIN) && defined(Q_CC_GNU) && !defined(Q_CC_INTEL) && !defined(Q_CC_CLANG) +// 64-bit GCC on Windows does not support AVX, so we hack around it by forcing +// it to emit unaligned loads & stores +// See https://gcc.gnu.org/bugzilla/show_bug.cgi?id=49001 +asm( + ".macro vmovapd args:vararg\n" + " vmovupd \\args\n" + ".endm\n" + ".macro vmovaps args:vararg\n" + " vmovups \\args\n" + ".endm\n" + ".macro vmovdqa args:vararg\n" + " vmovdqu \\args\n" + ".endm\n" + ".macro vmovdqa32 args:vararg\n" + " vmovdqu32 \\args\n" + ".endm\n" + ".macro vmovdqa64 args:vararg\n" + " vmovdqu64 \\args\n" + ".endm\n" +); +# endif + # if defined(Q_CC_GNU) && !defined(Q_CC_INTEL) && !defined(Q_OS_WASM) // GCC 4.4 and Clang 2.8 added a few more intrinsics there # include