0f1b6acab7
The AES instructions were first introduced with the Westmere shrink (22nm) of the Nehalem architecture. The SHA instructions are still pending on Intel architecture, but is available on AMD family 17h (gcc argument -march=znver1). Both features operate on SSE registers, so that's why the MSVC command- line argument is the SSE2 one and the configure-time tests depend on features.sse2. The qmake feature names end in "ni" because "aes" and "sha" are too simple and could clash with other uses. The QT_COMPILER_SUPPORTS_ macro doesn't have the "NI" suffix because it has to match the GCC/Clang predefined macro. Change-Id: I445bb15619f6401494e8fffd149dbd1f862ff51c Reviewed-by: Allan Sandfeld Jensen <allan.jensen@qt.io>
145 lines
5.2 KiB
Plaintext
145 lines
5.2 KiB
Plaintext
#
|
|
# W A R N I N G
|
|
# -------------
|
|
#
|
|
# This file is not part of the Qt API. It exists purely as an
|
|
# implementation detail. It may change from version to version
|
|
# without notice, or even be removed.
|
|
#
|
|
# We mean it.
|
|
#
|
|
|
|
# Get the SIMD flags
|
|
load(qt_build_config)
|
|
|
|
# Set QT_CPU_FEATURES for convenience
|
|
QT_CPU_FEATURES = $$eval(QT_CPU_FEATURES.$$QT_ARCH)
|
|
|
|
#
|
|
# Set up compilers for SIMD (SSE/AVX, NEON etc)
|
|
#
|
|
defineTest(addSimdCompiler) {
|
|
name = $$1
|
|
upname = $$upper($$name)
|
|
headers_var = $${upname}_HEADERS
|
|
sources_var = $${upname}_SOURCES
|
|
asm_var = $${upname}_ASM
|
|
|
|
CONFIG($$1) {
|
|
cflags = $$eval(QMAKE_CFLAGS_$${upname})
|
|
ltcg: cflags += $$QMAKE_CFLAGS_DISABLE_LTCG
|
|
contains(QT_CPU_FEATURES, $$name) {
|
|
# Default compiler settings include this feature, so just add to SOURCES
|
|
SOURCES += $$eval($$sources_var)
|
|
export(SOURCES)
|
|
} else {
|
|
# We need special compiler flags
|
|
$${name}_compiler.commands = $$QMAKE_CXX -c $(CXXFLAGS) $$cflags $(INCPATH) ${QMAKE_FILE_IN}
|
|
msvc: $${name}_compiler.commands += -Fo${QMAKE_FILE_OUT}
|
|
else: $${name}_compiler.commands += -o ${QMAKE_FILE_OUT}
|
|
|
|
$${name}_compiler.dependency_type = TYPE_C
|
|
$${name}_compiler.output = ${QMAKE_VAR_OBJECTS_DIR}${QMAKE_FILE_BASE}$${first(QMAKE_EXT_OBJ)}
|
|
$${name}_compiler.input = $$sources_var
|
|
$${name}_compiler.variable_out = OBJECTS
|
|
$${name}_compiler.name = compiling[$${name}] ${QMAKE_FILE_IN}
|
|
silent: $${name}_compiler.commands = @echo compiling[$${name}] ${QMAKE_FILE_IN} && $$eval($${name}_compiler.commands)
|
|
QMAKE_EXTRA_COMPILERS += $${name}_compiler
|
|
|
|
export($${name}_compiler.commands)
|
|
export($${name}_compiler.dependency_type)
|
|
export($${name}_compiler.output)
|
|
export($${name}_compiler.input)
|
|
export($${name}_compiler.variable_out)
|
|
export($${name}_compiler.name)
|
|
}
|
|
|
|
# We always need an assembler (need to run the C compiler and without precompiled headers)
|
|
msvc {
|
|
# Don't know how to run MSVC's assembler...
|
|
!isEmpty($$asm_var): error("Sorry, not implemented: assembling $$upname for MSVC.")
|
|
} else: false {
|
|
# This is just for the IDE
|
|
SOURCES += $$eval($$asm_var)
|
|
export(SOURCES)
|
|
} else {
|
|
$${name}_assembler.commands = $$QMAKE_CC -c $(CFLAGS)
|
|
!contains(QT_CPU_FEATURES, $${name}): $${name}_assembler.commands += $$cflags
|
|
clang:no_clang_integrated_as: $${name}_assembler.commands += -fno-integrated-as
|
|
$${name}_assembler.commands += $(INCPATH) ${QMAKE_FILE_IN} -o ${QMAKE_FILE_OUT}
|
|
$${name}_assembler.dependency_type = TYPE_C
|
|
$${name}_assembler.output = ${QMAKE_VAR_OBJECTS_DIR}${QMAKE_FILE_BASE}$${first(QMAKE_EXT_OBJ)}
|
|
$${name}_assembler.input = $$asm_var
|
|
$${name}_assembler.variable_out = OBJECTS
|
|
$${name}_assembler.name = assembling[$${name}] ${QMAKE_FILE_IN}
|
|
silent: $${name}_assembler.commands = @echo assembling[$${name}] ${QMAKE_FILE_IN} && $$eval($${name}_assembler.commands)
|
|
QMAKE_EXTRA_COMPILERS += $${name}_assembler
|
|
|
|
export($${name}_assembler.commands)
|
|
export($${name}_assembler.dependency_type)
|
|
export($${name}_assembler.output)
|
|
export($${name}_assembler.input)
|
|
export($${name}_assembler.variable_out)
|
|
export($${name}_assembler.name)
|
|
}
|
|
|
|
HEADERS += $$eval($$headers_var)
|
|
export(HEADERS)
|
|
export(QMAKE_EXTRA_COMPILERS)
|
|
}
|
|
}
|
|
addSimdCompiler(sse2)
|
|
addSimdCompiler(sse3)
|
|
addSimdCompiler(ssse3)
|
|
addSimdCompiler(sse4_1)
|
|
addSimdCompiler(sse4_2)
|
|
addSimdCompiler(aesni)
|
|
addSimdCompiler(shani)
|
|
addSimdCompiler(avx)
|
|
addSimdCompiler(avx2)
|
|
addSimdCompiler(avx512f)
|
|
addSimdCompiler(avx512cd)
|
|
addSimdCompiler(avx512er)
|
|
addSimdCompiler(avx512pf)
|
|
addSimdCompiler(avx512dq)
|
|
addSimdCompiler(avx512bw)
|
|
addSimdCompiler(avx512vl)
|
|
addSimdCompiler(avx512ifma)
|
|
addSimdCompiler(avx512vbmi)
|
|
addSimdCompiler(f16c)
|
|
addSimdCompiler(neon)
|
|
addSimdCompiler(mips_dsp)
|
|
addSimdCompiler(mips_dspr2)
|
|
|
|
# Follow the Intel compiler's lead and define profiles of AVX512 instructions
|
|
defineTest(addAvx512Profile) {
|
|
name = $$1
|
|
dependencies = $$2
|
|
upname = $$upper($$name)
|
|
varname = QMAKE_CFLAGS_$$upname
|
|
|
|
cpu_features_missing =
|
|
cflags = $$QMAKE_CFLAGS_AVX512F
|
|
for(part, dependencies) {
|
|
!CONFIG($$part): return() # Profile isn't supported by the compiler
|
|
|
|
uppart = $$upper($$part)
|
|
cflags *= $$eval(QMAKE_CFLAGS_$${uppart})
|
|
!contains(QT_CPU_FEATURES, $$uppart): cpu_features_missing += $$uppart
|
|
}
|
|
|
|
CONFIG += $$name
|
|
isEmpty(cpu_features_missing): QT_CPU_FEATURES += $$name
|
|
$$varname = $$cflags
|
|
|
|
export(QT_CPU_FEATURES)
|
|
export(CONFIG)
|
|
export($$varname)
|
|
addSimdCompiler($$name)
|
|
}
|
|
addAvx512Profile(avx512common, avx512cd)
|
|
addAvx512Profile(avx512mic, avx512cd avx512er avx512pf)
|
|
addAvx512Profile(avx512core, avx512cd avx512bw avx512dq avx512vl)
|
|
addAvx512Profile(avx512ifmavl, avx512ifma avx512vl)
|
|
addAvx512Profile(avx512vbmivl, avx512vbmi avx512vl)
|