draco_intrinsics.cmake 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. if(DRACO_CMAKE_DRACO_INTRINSICS_CMAKE_)
  2. return()
  3. endif() # DRACO_CMAKE_DRACO_INTRINSICS_CMAKE_
  4. set(DRACO_CMAKE_DRACO_INTRINSICS_CMAKE_ 1)
  5. # Returns the compiler flag for the SIMD intrinsics suffix specified by the
  6. # SUFFIX argument via the variable specified by the VARIABLE argument:
  7. # draco_get_intrinsics_flag_for_suffix(SUFFIX <suffix> VARIABLE <var name>)
  8. macro(draco_get_intrinsics_flag_for_suffix)
  9. unset(intrinsics_SUFFIX)
  10. unset(intrinsics_VARIABLE)
  11. unset(optional_args)
  12. unset(multi_value_args)
  13. set(single_value_args SUFFIX VARIABLE)
  14. cmake_parse_arguments(intrinsics "${optional_args}" "${single_value_args}"
  15. "${multi_value_args}" ${ARGN})
  16. if(NOT (intrinsics_SUFFIX AND intrinsics_VARIABLE))
  17. message(FATAL_ERROR "draco_get_intrinsics_flag_for_suffix: SUFFIX and "
  18. "VARIABLE required.")
  19. endif()
  20. if(intrinsics_SUFFIX MATCHES "neon")
  21. if(NOT MSVC)
  22. set(${intrinsics_VARIABLE} "${DRACO_NEON_INTRINSICS_FLAG}")
  23. endif()
  24. elseif(intrinsics_SUFFIX MATCHES "sse4")
  25. if(NOT MSVC)
  26. set(${intrinsics_VARIABLE} "-msse4.1")
  27. endif()
  28. else()
  29. message(FATAL_ERROR "draco_get_intrinsics_flag_for_suffix: Unknown "
  30. "instrinics suffix: ${intrinsics_SUFFIX}")
  31. endif()
  32. if(DRACO_VERBOSE GREATER 1)
  33. message("draco_get_intrinsics_flag_for_suffix: "
  34. "suffix:${intrinsics_SUFFIX} flag:${${intrinsics_VARIABLE}}")
  35. endif()
  36. endmacro()
  37. # Processes source files specified by SOURCES and adds intrinsics flags as
  38. # necessary: draco_process_intrinsics_sources(SOURCES <sources>)
  39. #
  40. # Detects requirement for intrinsics flags using source file name suffix.
  41. # Currently supports only SSE4.1.
  42. macro(draco_process_intrinsics_sources)
  43. unset(arg_TARGET)
  44. unset(arg_SOURCES)
  45. unset(optional_args)
  46. set(single_value_args TARGET)
  47. set(multi_value_args SOURCES)
  48. cmake_parse_arguments(arg "${optional_args}" "${single_value_args}"
  49. "${multi_value_args}" ${ARGN})
  50. if(NOT (arg_TARGET AND arg_SOURCES))
  51. message(FATAL_ERROR "draco_process_intrinsics_sources: TARGET and "
  52. "SOURCES required.")
  53. endif()
  54. if(DRACO_ENABLE_SSE4_1 AND draco_have_sse4)
  55. unset(sse4_sources)
  56. list(APPEND sse4_sources ${arg_SOURCES})
  57. list(FILTER sse4_sources INCLUDE REGEX
  58. "${draco_sse4_source_file_suffix}$")
  59. if(sse4_sources)
  60. unset(sse4_flags)
  61. draco_get_intrinsics_flag_for_suffix(SUFFIX
  62. ${draco_sse4_source_file_suffix}
  63. VARIABLE sse4_flags)
  64. if(sse4_flags)
  65. draco_set_compiler_flags_for_sources(SOURCES ${sse4_sources} FLAGS
  66. ${sse4_flags})
  67. endif()
  68. endif()
  69. endif()
  70. if(DRACO_ENABLE_NEON AND draco_have_neon)
  71. unset(neon_sources)
  72. list(APPEND neon_sources ${arg_SOURCES})
  73. list(FILTER neon_sources INCLUDE REGEX
  74. "${draco_neon_source_file_suffix}$")
  75. if(neon_sources AND DRACO_NEON_INTRINSICS_FLAG)
  76. unset(neon_flags)
  77. draco_get_intrinsics_flag_for_suffix(SUFFIX
  78. ${draco_neon_source_file_suffix}
  79. VARIABLE neon_flags)
  80. if(neon_flags)
  81. draco_set_compiler_flags_for_sources(SOURCES ${neon_sources} FLAGS
  82. ${neon_flags})
  83. endif()
  84. endif()
  85. endif()
  86. endmacro()