cmake: move functions to src/cmake
[vpp.git] / src / cmake / cpu.cmake
1 # Copyright (c) 2018 Cisco and/or its affiliates.
2 # Licensed under the Apache License, Version 2.0 (the "License");
3 # you may not use this file except in compliance with the License.
4 # You may obtain a copy of the License at:
5 #
6 #     http://www.apache.org/licenses/LICENSE-2.0
7 #
8 # Unless required by applicable law or agreed to in writing, software
9 # distributed under the License is distributed on an "AS IS" BASIS,
10 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11 # See the License for the specific language governing permissions and
12 # limitations under the License.
13
14 ##############################################################################
15 # CPU optimizations and multiarch support
16 ##############################################################################
17 if(CMAKE_SYSTEM_PROCESSOR MATCHES "amd64.*|x86_64.*|AMD64.*")
18   set(CMAKE_C_FLAGS "-march=corei7 -mtune=corei7-avx ${CMAKE_C_FLAGS}")
19   check_c_compiler_flag("-march=core-avx2" AVX2)
20   if(AVX2)
21     list(APPEND MARCH_VARIANTS "avx2\;-march=core-avx2 -mtune=core-avx2")
22   endif()
23   check_c_compiler_flag("-march=skylake-avx512" AVX512)
24   if(AVX512)
25     list(APPEND MARCH_VARIANTS "avx512\;-march=skylake-avx512 -mtune=skylake-avx512")
26   endif()
27 elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^(aarch64.*|AARCH64.*)")
28   set(CMAKE_C_FLAGS "-march=armv8-a+crc ${CMAKE_C_FLAGS}")
29 endif()
30
31 macro(vpp_library_set_multiarch_sources lib)
32   foreach(V ${MARCH_VARIANTS})
33     list(GET V 0 VARIANT)
34     list(GET V 1 VARIANT_FLAGS)
35     set(l ${lib}_${VARIANT})
36     add_library(${l} OBJECT ${ARGN})
37     set_target_properties(${l} PROPERTIES POSITION_INDEPENDENT_CODE ON)
38     target_compile_options(${l} PUBLIC "-DCLIB_MARCH_VARIANT=${VARIANT}")
39     separate_arguments(VARIANT_FLAGS)
40     target_compile_options(${l} PUBLIC ${VARIANT_FLAGS})
41     target_sources(${lib} PRIVATE $<TARGET_OBJECTS:${l}>)
42   endforeach()
43 endmacro()
44