diff options
-rw-r--r-- | cmake/QtCompilerOptimization.cmake | 3 | ||||
-rw-r--r-- | cmake/QtInternalTargets.cmake | 4 | ||||
-rw-r--r-- | cmake/QtWasmHelpers.cmake | 5 | ||||
-rw-r--r-- | config.tests/arch/CMakeLists.txt | 4 | ||||
-rw-r--r-- | configure.cmake | 6 | ||||
-rw-r--r-- | mkspecs/features/wasm/wasm.prf | 8 | ||||
-rw-r--r-- | src/corelib/global/qprocessordetection.h | 4 | ||||
-rw-r--r-- | src/corelib/global/qsimd_p.h | 5 |
8 files changed, 36 insertions, 3 deletions
diff --git a/cmake/QtCompilerOptimization.cmake b/cmake/QtCompilerOptimization.cmake index 952ace6652..69029a59de 100644 --- a/cmake/QtCompilerOptimization.cmake +++ b/cmake/QtCompilerOptimization.cmake @@ -199,4 +199,7 @@ if(WASM) set(QT_CFLAGS_OPTIMIZE_FULL "-O3") set(QT_CFLAGS_OPTIMIZE_SIZE "-Os") set(QT_CFLAGS_OPTIMIZE_DEBUG "-g2") + + set(QT_CFLAGS_SSE2 -O2 -msimd128 -msse -msse2) + endif() diff --git a/cmake/QtInternalTargets.cmake b/cmake/QtInternalTargets.cmake index 317deb185a..ea4157a8ba 100644 --- a/cmake/QtInternalTargets.cmake +++ b/cmake/QtInternalTargets.cmake @@ -177,6 +177,10 @@ if(UIKIT) qt_internal_apply_bitcode_flags(PlatformCommonInternal) endif() +if(WASM AND QT_FEATURE_sse2) + target_compile_definitions(PlatformCommonInternal INTERFACE QT_COMPILER_SUPPORTS_SSE2) +endif() + # Taken from mkspecs/common/msvc-version.conf and mkspecs/common/msvc-desktop.conf if (MSVC) if (MSVC_VERSION GREATER_EQUAL 1799) diff --git a/cmake/QtWasmHelpers.cmake b/cmake/QtWasmHelpers.cmake index 240eaa0540..b80f0d0e18 100644 --- a/cmake/QtWasmHelpers.cmake +++ b/cmake/QtWasmHelpers.cmake @@ -19,6 +19,11 @@ function (qt_internal_setup_wasm_target_properties wasmTarget) target_compile_options("${wasmTarget}" INTERFACE --bind) + #simd + if (QT_FEATURE_sse2) + target_compile_options("${wasmTarget}" INTERFACE -O2 -msimd128 -msse -msse2) + endif() + # Hardcode wasm memory size. Emscripten does not currently support memory growth # (ALLOW_MEMORY_GROWTH) in pthreads mode, and requires specifying the memory size # at build time. Further, browsers limit the maximum initial memory size to 1GB. diff --git a/config.tests/arch/CMakeLists.txt b/config.tests/arch/CMakeLists.txt index 2e11f20674..9ef6e37b3b 100644 --- a/config.tests/arch/CMakeLists.txt +++ b/config.tests/arch/CMakeLists.txt @@ -4,3 +4,7 @@ project(arch LANGUAGES CXX) add_executable(architecture_test) set_property(TARGET architecture_test PROPERTY MACOSX_BUNDLE FALSE) target_sources(architecture_test PRIVATE arch.cpp) + +if(EMSCRIPTEN) + target_compile_options(architecture_test PRIVATE -O2 -msimd128 -msse -msse2) +endif() diff --git a/configure.cmake b/configure.cmake index 7341594e39..3c0079ef49 100644 --- a/configure.cmake +++ b/configure.cmake @@ -659,7 +659,9 @@ qt_feature("signaling_nan" PUBLIC ) qt_feature("sse2" PRIVATE LABEL "SSE2" - CONDITION ( ( ( TEST_architecture_arch STREQUAL i386 ) OR ( TEST_architecture_arch STREQUAL x86_64 ) ) AND TEST_subarch_sse2 ) OR QT_FORCE_FEATURE_sse2 # special case + CONDITION ( ( ( TEST_architecture_arch STREQUAL i386 ) + OR ( TEST_architecture_arch STREQUAL x86_64 ) ) AND TEST_subarch_sse2 ) OR QT_FORCE_FEATURE_sse2 OR WASM + AUTODETECT NOT WASM ) qt_feature_definition("sse2" "QT_COMPILER_SUPPORTS_SSE2" VALUE "1") qt_feature_config("sse2" QMAKE_PRIVATE_CONFIG) @@ -1017,7 +1019,7 @@ qt_configure_add_summary_entry( TYPE "featureList" ARGS "sse2 sse3 ssse3 sse4_1 sse4_2" MESSAGE "SSE" - CONDITION ( ( TEST_architecture_arch STREQUAL i386 ) OR ( TEST_architecture_arch STREQUAL x86_64 ) ) + CONDITION ( ( TEST_architecture_arch STREQUAL i386 ) OR ( TEST_architecture_arch STREQUAL x86_64 ) OR ( TEST_architecture_arch STREQUAL wasm ) ) ) qt_configure_add_summary_entry( TYPE "featureList" diff --git a/mkspecs/features/wasm/wasm.prf b/mkspecs/features/wasm/wasm.prf index 5ffc647135..e1b10cb23a 100644 --- a/mkspecs/features/wasm/wasm.prf +++ b/mkspecs/features/wasm/wasm.prf @@ -36,6 +36,14 @@ exists($$QMAKE_QT_CONFIG) { message("Setting INITIAL_MEMORY to" $$INITIAL_MEMORY) EMCC_THREAD_LFLAGS += -s INITIAL_MEMORY=$$INITIAL_MEMORY } + + qtConfig(sse2) { + QMAKE_CFLAGS += -O2 -msimd128 -msse -msse2 + QMAKE_CXXFLAGS += -O2 -msimd128 -msse -msse2 + QMAKE_LFLAGS += -msimd128 -msse -msse2 + QMAKE_LFLAGS_DEBUG += -msimd128 -msse -msse2 + } + QMAKE_LFLAGS += $$EMCC_THREAD_LFLAGS QMAKE_LFLAGS_DEBUG += $$EMCC_THREAD_LFLAGS QMAKE_CFLAGS += $$EMCC_THREAD_LFLAGS diff --git a/src/corelib/global/qprocessordetection.h b/src/corelib/global/qprocessordetection.h index f7bca43345..72cc0b4ad4 100644 --- a/src/corelib/global/qprocessordetection.h +++ b/src/corelib/global/qprocessordetection.h @@ -340,6 +340,10 @@ # define Q_PROCESSOR_WASM # define Q_BYTE_ORDER Q_LITTLE_ENDIAN # define Q_PROCESSOR_WORDSIZE 8 +#ifdef QT_COMPILER_SUPPORTS_SSE2 +# define Q_PROCESSOR_X86 6 // enables SIMD support +#endif + #endif /* diff --git a/src/corelib/global/qsimd_p.h b/src/corelib/global/qsimd_p.h index 35979176fa..118a62e6ac 100644 --- a/src/corelib/global/qsimd_p.h +++ b/src/corelib/global/qsimd_p.h @@ -190,10 +190,13 @@ # define __SSE__ 1 # endif -# if defined(Q_CC_GNU) && !defined(Q_CC_INTEL) +# 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 <x86intrin.h> # endif +#ifdef Q_OS_WASM +# include <immintrin.h> +# endif # if defined(__SSE4_2__) && defined(QT_COMPILER_SUPPORTS_SIMD_ALWAYS) && (defined(Q_CC_INTEL) || defined(Q_CC_MSVC)) // POPCNT instructions: |