[RISCV] Support f32/f64 libcalls for sin/cos/pow/log/log2/log10/exp/exp2
[llvm-project.git] / openmp / runtime / cmake / LibompGetArchitecture.cmake
blob2d5c6622c9f7dda36d7ebe369c68847c8910833b
2 #//===----------------------------------------------------------------------===//
3 #//
4 #// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
5 #// See https://llvm.org/LICENSE.txt for license information.
6 #// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7 #//
8 #//===----------------------------------------------------------------------===//
11 # Determine the architecture from predefined compiler macros
12 # The architecture name can only contain alphanumeric characters and underscores (i.e., C identifier)
14 # void get_architecture(string* return_arch)
15 # - Returns the architecture in return_arch
16 function(libomp_get_architecture return_arch)
17   set(detect_arch_src_txt "
18     #if defined(__KNC__)
19       #error ARCHITECTURE=mic
20     #elif defined(__amd64__) || defined(__amd64) || defined(__x86_64__) || defined(__x86_64) || defined(_M_X64) || defined(_M_AMD64)
21       #error ARCHITECTURE=x86_64
22     #elif defined(__i386) || defined(__i386__) || defined(__IA32__) || defined(_M_I86) || defined(_M_IX86) || defined(__X86__) || defined(_X86_)
23       #error ARCHITECTURE=i386
24     #elif defined(__ARM_ARCH_7__) || defined(__ARM_ARCH_7R__) ||  defined(__ARM_ARCH_7A__) || defined(__ARM_ARCH_7M__)  || defined(__ARM_ARCH_7S__)
25       #error ARCHITECTURE=arm
26     #elif defined(__ARM_ARCH_6__) || defined(__ARM_ARCH_6J__) || defined(__ARM_ARCH_6K__)  || defined(__ARM_ARCH_6Z__)  || defined(__ARM_ARCH_6T2__) || defined(__ARM_ARCH_6ZK__)
27       #error ARCHITECTURE=arm
28     #elif defined(__ARM_ARCH_5__) || defined(__ARM_ARCH_5T__) || defined(__ARM_ARCH_5E__)  || defined(__ARM_ARCH_5TE__) || defined(__ARM_ARCH_5TEJ__)
29       #error ARCHITECTURE=arm
30     #elif defined(__ARM_ARCH_4__) || defined(__ARM_ARCH_4T__)
31       #error ARCHITECTURE=arm
32     #elif defined(__ARM_ARCH_3__) || defined(__ARM_ARCH_3M__)
33       #error ARCHITECTURE=arm
34     #elif defined(__ARM_ARCH_2__)
35       #error ARCHITECTURE=arm
36     #elif defined(__arm__) || defined(_M_ARM) || defined(_ARM)
37       #error ARCHITECTURE=arm
38     #elif defined(__ARM64_ARCH_8_32__)
39       #error ARCHITECTURE=aarch64_32
40     #elif defined(__aarch64__) || defined(_M_ARM64)
41       #error ARCHITECTURE=aarch64
42     #elif defined(__powerpc64__) && defined(__LITTLE_ENDIAN__)
43       #error ARCHITECTURE=ppc64le
44     #elif defined(__powerpc64__)
45       #error ARCHITECTURE=ppc64
46     #elif defined(__powerpc__) && !defined(__powerpc64__)
47       #error ARCHITECTURE=ppc
48     #elif defined(__mips__) && defined(__mips64)
49       #error ARCHITECTURE=mips64
50     #elif defined(__mips__) && !defined(__mips64)
51       #error ARCHITECTURE=mips
52     #elif defined(__riscv) && __riscv_xlen == 64
53       #error ARCHITECTURE=riscv64
54     #elif defined(__loongarch__) && __loongarch_grlen == 64
55       #error ARCHITECTURE=loongarch64
56     #elif defined(__ve__)
57       #error ARCHITECTURE=ve
58     #elif defined(__s390x__)
59       #error ARCHITECTURE=s390x
60     #elif defined(__wasm32__)
61       #error ARCHITECTURE=wasm32
62     #else
63       #error ARCHITECTURE=UnknownArchitecture
64     #endif
65   ")
66   # Write out ${detect_arch_src_txt} to a file within the cmake/ subdirectory
67   file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/libomp_detect_arch.c" ${detect_arch_src_txt})
69   # Try to compile using the C Compiler.  It will always error out with an #error directive, so store error output to ${local_architecture}
70   try_run(run_dummy compile_dummy "${CMAKE_CURRENT_BINARY_DIR}" "${CMAKE_CURRENT_BINARY_DIR}/libomp_detect_arch.c" COMPILE_OUTPUT_VARIABLE local_architecture)
72   # Match the important architecture line and store only that matching string in ${local_architecture}
73   string(REGEX MATCH "ARCHITECTURE=([a-zA-Z0-9_]+)" local_architecture "${local_architecture}")
75   # Get rid of the ARCHITECTURE= part of the string
76   string(REPLACE "ARCHITECTURE=" "" local_architecture "${local_architecture}")
78   # set the return value to the architecture detected (e.g., 32e, 32, arm, ppc64, etc.)
79   set(${return_arch} "${local_architecture}" PARENT_SCOPE)
81   # Remove ${detect_arch_src_txt} from cmake/ subdirectory
82   file(REMOVE "${CMAKE_CURRENT_BINARY_DIR}/libomp_detect_arch.c")
83 endfunction()
85 function(libomp_is_aarch64_a64fx return_is_aarch64_a64fx)
86   set(is_aarch64_a64fx FALSE)
87   if (EXISTS "/proc/cpuinfo")
88     file(READ "/proc/cpuinfo" cpu_info_content)
89     string(REGEX MATCH "CPU implementer[ \t]*: 0x46\n" cpu_implementer ${cpu_info_content})
90     string(REGEX MATCH "CPU architecture[ \t]*: 8\n" cpu_architecture ${cpu_info_content})
92     if (cpu_architecture AND cpu_implementer)
93       set(is_aarch64_a64fx TRUE)
94     endif()
95   endif()
97   set(${return_is_aarch64_a64fx} "${is_aarch64_a64fx}" PARENT_SCOPE)
98 endfunction(libomp_is_aarch64_a64fx)