CMake: Fix incorrect SIMD arch_haswell and avx profile conditions
Fix the conditions in qt_add_simd_part for arch_haswell and the avx512 profiles to mimic what simd.prf does. Add missing SIMD flags in QtCompilerOptimization for arch_haswell. Compute the compile flags for the avx512 profiles from the profile dependencies. Remove the special case in Gui that hardcoded the compilation of qdrawhelper_avx2.cpp to be conditional on avx2 being enabled instead of arch_haswell. The Gui project already has another qt_add_simd_part that is enabled if arch_haswell is enabled, which will now work correctly due to the fixes in qt_add_simd_part. Change-Id: I7a61a03b5565d4fa438f22b329e0d9dd7acd9273 Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org> Reviewed-by: Joerg Bornemann <joerg.bornemann@qt.io>
This commit is contained in:
parent
f9e1674094
commit
60d72b7ab6
@ -4909,12 +4909,44 @@ function(qt_add_simd_part target)
|
||||
endif()
|
||||
|
||||
set(condition "QT_FEATURE_${arg_SIMD}")
|
||||
string(TOUPPER "QT_CFLAGS_${arg_SIMD}" simd_flags_var_name)
|
||||
set(simd_flags_expanded "")
|
||||
|
||||
# As per mkspecs/features/simd.prf, the arch_haswell SIMD compiler is enabled when
|
||||
# qmake's CONFIG contains "avx2", which maps to CMake's QT_FEATURE_avx2.
|
||||
# The list of dependencies 'avx2 bmi bmi2 f16c fma lzcnt popcnt' only influences whether
|
||||
# the 'arch_haswell' SIMD flags need to be added explicitly to the compiler invocation.
|
||||
# If the compiler adds them implicitly, they must be present in qmake's QT_CPU_FEATURES as
|
||||
# detected by the architecture test, and thus they are present in TEST_subarch_result.
|
||||
if("${arg_SIMD}" STREQUAL arch_haswell)
|
||||
set(condition "TEST_subarch_avx2 AND TEST_subarch_bmi AND TEST_subarch_bmi2 AND TEST_subarch_f16c AND TEST_subarch_fma AND TEST_subarch_lzcnt AND TEST_subarch_popcnt")
|
||||
set(condition "QT_FEATURE_avx2")
|
||||
|
||||
# Use avx2 flags as per simd.prf, if there are no specific arch_haswell flags specified in
|
||||
# QtCompilerOptimization.cmake.
|
||||
if("${simd_flags_var_name}" STREQUAL "")
|
||||
set(simd_flags_var_name "QT_CFLAGS_AVX2")
|
||||
endif()
|
||||
|
||||
# The avx512 profiles dependencies DO influence if the SIMD compiler will be executed,
|
||||
# so each of the profile dependencies have to be in qmake's CONFIG for the compiler to be
|
||||
# enabled, which means the CMake features have to evaluate to true.
|
||||
# Also the profile flags to be used are a combination of arch_haswell, avx512f and each of the
|
||||
# dependencies.
|
||||
elseif("${arg_SIMD}" STREQUAL avx512common)
|
||||
set(condition "TEST_subarch_avx512cd")
|
||||
set(condition "QT_FEATURE_avx512cd")
|
||||
list(APPEND simd_flags_expanded "${QT_CFLAGS_ARCH_HASWELL}")
|
||||
list(APPEND simd_flags_expanded "${QT_CFLAGS_AVX512F}")
|
||||
list(APPEND simd_flags_expanded "${QT_CFLAGS_AVX512CD}")
|
||||
list(REMOVE_DUPLICATES simd_flags_expanded)
|
||||
elseif("${arg_SIMD}" STREQUAL avx512core)
|
||||
set(condition "TEST_subarch_avx512cd AND TEST_subarch_avx512bw AND TEST_subarch_avx512dq AND TEST_subarch_avx512vl")
|
||||
set(condition "QT_FEATURE_avx512cd AND QT_FEATURE_avx512bw AND QT_FEATURE_avx512dq AND QT_FEATURE_avx512vl")
|
||||
list(APPEND simd_flags_expanded "${QT_CFLAGS_ARCH_HASWELL}")
|
||||
list(APPEND simd_flags_expanded "${QT_CFLAGS_AVX512F}")
|
||||
list(APPEND simd_flags_expanded "${QT_CFLAGS_AVX512CD}")
|
||||
list(APPEND simd_flags_expanded "${QT_CFLAGS_AVX512BW}")
|
||||
list(APPEND simd_flags_expanded "${QT_CFLAGS_AVX512DQ}")
|
||||
list(APPEND simd_flags_expanded "${QT_CFLAGS_AVX512VL}")
|
||||
list(REMOVE_DUPLICATES simd_flags_expanded)
|
||||
endif()
|
||||
|
||||
set(name "${arg_NAME}")
|
||||
@ -4927,12 +4959,15 @@ function(qt_add_simd_part target)
|
||||
if(QT_CMAKE_DEBUG_EXTEND_TARGET)
|
||||
message("qt_add_simd_part(${target} SIMD ${arg_SIMD} ...): Evaluated")
|
||||
endif()
|
||||
string(TOUPPER "QT_CFLAGS_${arg_SIMD}" simd_flags)
|
||||
|
||||
if(NOT simd_flags_expanded)
|
||||
set(simd_flags_expanded "${${simd_flags_var_name}}")
|
||||
endif()
|
||||
|
||||
foreach(source IN LISTS arg_SOURCES)
|
||||
set_property(SOURCE "${source}" APPEND
|
||||
PROPERTY COMPILE_OPTIONS
|
||||
${${simd_flags}}
|
||||
${simd_flags_expanded}
|
||||
${arg_COMPILE_FLAGS}
|
||||
)
|
||||
endforeach()
|
||||
|
@ -51,6 +51,7 @@ if(GCC OR CLANG)
|
||||
set(QT_CFLAGS_RDRND "-mrdrnd")
|
||||
set(QT_CFLAGS_AVX "-mavx")
|
||||
set(QT_CFLAGS_AVX2 "-mavx2")
|
||||
set(QT_CFLAGS_ARCH_HASWELL "-march=core-avx2")
|
||||
set(QT_CFLAGS_AVX512F "-mavx512f")
|
||||
set(QT_CFLAGS_AVX512ER "-mavx512er")
|
||||
set(QT_CFLAGS_AVX512CD "-mavx512cd")
|
||||
|
@ -304,15 +304,6 @@ if(QT_FEATURE_reduce_relocations AND UNIX AND GCC)
|
||||
"LINKER:--dynamic-list=${CMAKE_CURRENT_LIST_DIR}/QtGui.dynlist")
|
||||
endif()
|
||||
|
||||
# special case begin
|
||||
# Replace arch_haswell with avx2 feature. That is what is used in the code requireing
|
||||
# this file, too!
|
||||
qt_add_simd_part(Gui SIMD avx2
|
||||
SOURCES
|
||||
painting/qdrawhelper_avx2.cpp
|
||||
)
|
||||
# special case end
|
||||
|
||||
# special case begin
|
||||
qt_extend_target(Gui CONDITION QT_FEATURE_standarditemmodel
|
||||
SOURCES
|
||||
|
Loading…
x
Reference in New Issue
Block a user