diff options
author | Lorn Potter <lorn.potter@gmail.com> | 2021-04-16 15:34:57 +1000 |
---|---|---|
committer | Qt Cherry-pick Bot <cherrypick_bot@qt-project.org> | 2021-10-05 01:30:16 +0000 |
commit | 01fe5aaeea74cc25d4052fec0be6d7d03e0faec0 (patch) | |
tree | f29c53f354741b3607c2bf2a5475fa8043a3e4df | |
parent | dfe98121e9bbc769d06949a7d2ec6e57ae86d0b7 (diff) |
wasm: add simd support
Emscripten only supports
SSE1, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, and 128-bit AVX instruction
sets at this time.
https://emscripten.org/docs/porting/simd.html
Browsers might need to enable simd support in the advanced
configurations
about: config or chrome:flags
Enable by configuring Qt with -sse2
Fixes: QTBUG-63924
Change-Id: Ifeafae20e199dee0d19689802ad20fd0bd424ca7
Reviewed-by: Morten Johan Sørvig <morten.sorvig@qt.io>
(cherry picked from commit 0e100a4d892cbdcdb7f326213ec1e4d0d1ae6d89)
Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
-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 22080b4d53..02be218ebe 100644 --- a/cmake/QtInternalTargets.cmake +++ b/cmake/QtInternalTargets.cmake @@ -186,6 +186,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 bc5e455fcd..cc26341ca8 100644 --- a/cmake/QtWasmHelpers.cmake +++ b/cmake/QtWasmHelpers.cmake @@ -9,6 +9,11 @@ function (qt_internal_setup_wasm_target_properties wasmTarget) "SHELL:-s FETCH=1") 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 5705e37611..4d21afe0cb 100644 --- a/configure.cmake +++ b/configure.cmake @@ -646,7 +646,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) @@ -1004,7 +1006,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: |