| # |
| # 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 |
| csources_var = $${upname}_C_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 |
| |
| # Split C and C++ sources |
| $$csources_var = $$find($$sources_var, ".*\\.c$") |
| $$sources_var -= $$eval($$csources_var) |
| export($$csources_var) |
| export($$sources_var) |
| |
| # Add C++ compiler |
| $${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) |
| |
| # Add a C compiler |
| $${name}_c_compiler.commands = $$QMAKE_CC -c $(CFLAGS) $$cflags $(INCPATH) ${QMAKE_FILE_IN} |
| msvc: $${name}_c_compiler.commands += -Fo${QMAKE_FILE_OUT} |
| else: $${name}_c_compiler.commands += -o ${QMAKE_FILE_OUT} |
| |
| $${name}_c_compiler.dependency_type = TYPE_C |
| $${name}_c_compiler.output = ${QMAKE_VAR_OBJECTS_DIR}${QMAKE_FILE_BASE}$${first(QMAKE_EXT_OBJ)} |
| $${name}_c_compiler.input = $$csources_var |
| $${name}_c_compiler.variable_out = OBJECTS |
| $${name}_c_compiler.name = compiling[$${name}] ${QMAKE_FILE_IN} |
| silent: $${name}_c_compiler.commands = @echo compiling[$${name}] ${QMAKE_FILE_IN} && $$eval($${name}_c_compiler.commands) |
| QMAKE_EXTRA_COMPILERS += $${name}_c_compiler |
| |
| export($${name}_c_compiler.commands) |
| export($${name}_c_compiler.dependency_type) |
| export($${name}_c_compiler.output) |
| export($${name}_c_compiler.input) |
| export($${name}_c_compiler.variable_out) |
| export($${name}_c_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(vaes) |
| addSimdCompiler(avx) |
| addSimdCompiler(avx2) |
| addSimdCompiler(avx512f) |
| addSimdCompiler(avx512cd) |
| addSimdCompiler(avx512er) |
| addSimdCompiler(avx512pf) |
| addSimdCompiler(avx512dq) |
| addSimdCompiler(avx512bw) |
| addSimdCompiler(avx512vl) |
| addSimdCompiler(avx512vnni) |
| addSimdCompiler(avx512ifma) |
| addSimdCompiler(avx512vbmi) |
| addSimdCompiler(avx512vbmi2) |
| addSimdCompiler(avx512bitalg) |
| addSimdCompiler(avx512vpopcntd) |
| addSimdCompiler(f16c) |
| addSimdCompiler(rdrnd) |
| addSimdCompiler(rdseed) |
| addSimdCompiler(neon) |
| addSimdCompiler(mips_dsp) |
| addSimdCompiler(mips_dspr2) |
| |
| # Haswell sub-architecture |
| defineTest(addSimdArch) { |
| name = arch_$$1 |
| dependencies = $$2 |
| upname = $$upper($$name) |
| |
| cpu_features_missing = |
| for(part, dependencies) { |
| !contains(QT_CPU_FEATURES, $$part): cpu_features_missing = 1 |
| } |
| |
| CONFIG += $$name |
| isEmpty(cpu_features_missing): QT_CPU_FEATURES += $$name |
| |
| export(QT_CPU_FEATURES) |
| export(CONFIG) |
| addSimdCompiler($$name) |
| } |
| |
| isEmpty(QMAKE_CFLAGS_ARCH_HASWELL): QMAKE_CFLAGS_ARCH_HASWELL = $$QMAKE_CFLAGS_AVX2 |
| avx2: addSimdArch(haswell, avx2 bmi bmi2 f16c fma lzcnt popcnt) |
| |
| # 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_ARCH_HASWELL $$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(avx512core, avx512cd avx512bw avx512dq avx512vl) |