simd.prf 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  1. #
  2. # W A R N I N G
  3. # -------------
  4. #
  5. # This file is not part of the Qt API. It exists purely as an
  6. # implementation detail. It may change from version to version
  7. # without notice, or even be removed.
  8. #
  9. # We mean it.
  10. #
  11. # Get the SIMD flags
  12. load(qt_build_config)
  13. # Set QT_CPU_FEATURES for convenience
  14. QT_CPU_FEATURES = $$eval(QT_CPU_FEATURES.$$QT_ARCH)
  15. #
  16. # Set up compilers for SIMD (SSE/AVX, NEON etc)
  17. #
  18. defineTest(addSimdCompiler) {
  19. name = $$1
  20. upname = $$upper($$name)
  21. headers_var = $${upname}_HEADERS
  22. sources_var = $${upname}_SOURCES
  23. asm_var = $${upname}_ASM
  24. CONFIG($$1) {
  25. cflags = $$eval(QMAKE_CFLAGS_$${upname})
  26. ltcg: cflags += $$QMAKE_CFLAGS_DISABLE_LTCG
  27. contains(QT_CPU_FEATURES, $$name) {
  28. # Default compiler settings include this feature, so just add to SOURCES
  29. SOURCES += $$eval($$sources_var)
  30. export(SOURCES)
  31. } else {
  32. # We need special compiler flags
  33. $${name}_compiler.commands = $$QMAKE_CXX -c $(CXXFLAGS) $$cflags $(INCPATH) ${QMAKE_FILE_IN}
  34. msvc: $${name}_compiler.commands += -Fo${QMAKE_FILE_OUT}
  35. else: $${name}_compiler.commands += -o ${QMAKE_FILE_OUT}
  36. $${name}_compiler.dependency_type = TYPE_C
  37. $${name}_compiler.output = ${QMAKE_VAR_OBJECTS_DIR}${QMAKE_FILE_BASE}$${first(QMAKE_EXT_OBJ)}
  38. $${name}_compiler.input = $$sources_var
  39. $${name}_compiler.variable_out = OBJECTS
  40. $${name}_compiler.name = compiling[$${name}] ${QMAKE_FILE_IN}
  41. silent: $${name}_compiler.commands = @echo compiling[$${name}] ${QMAKE_FILE_IN} && $$eval($${name}_compiler.commands)
  42. QMAKE_EXTRA_COMPILERS += $${name}_compiler
  43. export($${name}_compiler.commands)
  44. export($${name}_compiler.dependency_type)
  45. export($${name}_compiler.output)
  46. export($${name}_compiler.input)
  47. export($${name}_compiler.variable_out)
  48. export($${name}_compiler.name)
  49. }
  50. # We always need an assembler (need to run the C compiler and without precompiled headers)
  51. msvc {
  52. # Don't know how to run MSVC's assembler...
  53. !isEmpty($$asm_var): error("Sorry, not implemented: assembling $$upname for MSVC.")
  54. } else: false {
  55. # This is just for the IDE
  56. SOURCES += $$eval($$asm_var)
  57. export(SOURCES)
  58. } else {
  59. $${name}_assembler.commands = $$QMAKE_CC -c $(CFLAGS)
  60. !contains(QT_CPU_FEATURES, $${name}): $${name}_assembler.commands += $$cflags
  61. clang:no_clang_integrated_as: $${name}_assembler.commands += -fno-integrated-as
  62. $${name}_assembler.commands += $(INCPATH) ${QMAKE_FILE_IN} -o ${QMAKE_FILE_OUT}
  63. $${name}_assembler.dependency_type = TYPE_C
  64. $${name}_assembler.output = ${QMAKE_VAR_OBJECTS_DIR}${QMAKE_FILE_BASE}$${first(QMAKE_EXT_OBJ)}
  65. $${name}_assembler.input = $$asm_var
  66. $${name}_assembler.variable_out = OBJECTS
  67. $${name}_assembler.name = assembling[$${name}] ${QMAKE_FILE_IN}
  68. silent: $${name}_assembler.commands = @echo assembling[$${name}] ${QMAKE_FILE_IN} && $$eval($${name}_assembler.commands)
  69. QMAKE_EXTRA_COMPILERS += $${name}_assembler
  70. export($${name}_assembler.commands)
  71. export($${name}_assembler.dependency_type)
  72. export($${name}_assembler.output)
  73. export($${name}_assembler.input)
  74. export($${name}_assembler.variable_out)
  75. export($${name}_assembler.name)
  76. }
  77. HEADERS += $$eval($$headers_var)
  78. export(HEADERS)
  79. export(QMAKE_EXTRA_COMPILERS)
  80. }
  81. }
  82. addSimdCompiler(sse2)
  83. addSimdCompiler(sse3)
  84. addSimdCompiler(ssse3)
  85. addSimdCompiler(sse4_1)
  86. addSimdCompiler(sse4_2)
  87. addSimdCompiler(avx)
  88. addSimdCompiler(avx2)
  89. addSimdCompiler(avx512f)
  90. addSimdCompiler(avx512cd)
  91. addSimdCompiler(avx512er)
  92. addSimdCompiler(avx512pf)
  93. addSimdCompiler(avx512dq)
  94. addSimdCompiler(avx512bw)
  95. addSimdCompiler(avx512vl)
  96. addSimdCompiler(avx512ifma)
  97. addSimdCompiler(avx512vbmi)
  98. addSimdCompiler(neon)
  99. addSimdCompiler(mips_dsp)
  100. addSimdCompiler(mips_dspr2)
  101. # Follow the Intel compiler's lead and define profiles of AVX512 instructions
  102. defineTest(addAvx512Profile) {
  103. name = $$1
  104. dependencies = $$2
  105. upname = $$upper($$name)
  106. varname = QMAKE_CFLAGS_$$upname
  107. cpu_features_missing =
  108. cflags = $$QMAKE_CFLAGS_AVX512F
  109. for(part, dependencies) {
  110. !CONFIG($$part): return() # Profile isn't supported by the compiler
  111. uppart = $$upper($$part)
  112. cflags *= $$eval(QMAKE_CFLAGS_$${uppart})
  113. !contains(QT_CPU_FEATURES, $$uppart): cpu_features_missing += $$uppart
  114. }
  115. CONFIG += $$name
  116. isEmpty(cpu_features_missing): QT_CPU_FEATURES += $$name
  117. $$varname = $$cflags
  118. export(QT_CPU_FEATURES)
  119. export(CONFIG)
  120. export($$varname)
  121. addSimdCompiler($$name)
  122. }
  123. addAvx512Profile(avx512common, avx512cd)
  124. addAvx512Profile(avx512mic, avx512cd avx512er avx512pf)
  125. addAvx512Profile(avx512core, avx512cd avx512bw avx512dq avx512vl)
  126. addAvx512Profile(avx512ifmavl, avx512ifma avx512vl)
  127. addAvx512Profile(avx512vbmivl, avx512vbmi avx512vl)