123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141 |
- #
- # 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(avx)
- addSimdCompiler(avx2)
- addSimdCompiler(avx512f)
- addSimdCompiler(avx512cd)
- addSimdCompiler(avx512er)
- addSimdCompiler(avx512pf)
- addSimdCompiler(avx512dq)
- addSimdCompiler(avx512bw)
- addSimdCompiler(avx512vl)
- addSimdCompiler(avx512ifma)
- addSimdCompiler(avx512vbmi)
- 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)
|