xref: /aosp_15_r20/external/pytorch/cmake/Modules/FindARM.cmake (revision da0073e96a02ea20f0ac840b70461e3646d07c45)
1*da0073e9SAndroid Build Coastguard Worker# Check if the processor is an ARM and if Neon instruction are available on the machine where
2*da0073e9SAndroid Build Coastguard Worker# the project is compiled.
3*da0073e9SAndroid Build Coastguard Worker
4*da0073e9SAndroid Build Coastguard WorkerIF(CMAKE_SYSTEM_NAME MATCHES "Linux")
5*da0073e9SAndroid Build Coastguard Worker   EXECUTE_PROCESS(COMMAND cat /proc/cpuinfo OUTPUT_VARIABLE CPUINFO)
6*da0073e9SAndroid Build Coastguard Worker
7*da0073e9SAndroid Build Coastguard Worker   #neon instruction can be found on the majority part of modern ARM processor
8*da0073e9SAndroid Build Coastguard Worker   STRING(REGEX REPLACE "^.*(neon).*$" "\\1" NEON_THERE "${CPUINFO}")
9*da0073e9SAndroid Build Coastguard Worker   STRING(COMPARE EQUAL "neon" "${NEON_THERE}" NEON_TRUE)
10*da0073e9SAndroid Build Coastguard Worker   IF (NEON_TRUE)
11*da0073e9SAndroid Build Coastguard Worker      set(NEON_FOUND true CACHE BOOL "NEON available on host")
12*da0073e9SAndroid Build Coastguard Worker   ELSE (NEON_TRUE)
13*da0073e9SAndroid Build Coastguard Worker      set(NEON_FOUND false CACHE BOOL "NEON available on host")
14*da0073e9SAndroid Build Coastguard Worker   ENDIF (NEON_TRUE)
15*da0073e9SAndroid Build Coastguard Worker
16*da0073e9SAndroid Build Coastguard Worker   # on ARMv8, neon is inherit and instead listed as 'asimd' in /proc/cpuinfo
17*da0073e9SAndroid Build Coastguard Worker   STRING(REGEX REPLACE "^.*(asimd).*$" "\\1" ASIMD_THERE "${CPUINFO}")
18*da0073e9SAndroid Build Coastguard Worker   STRING(COMPARE EQUAL "asimd" "${ASIMD_THERE}" ASIMD_TRUE)
19*da0073e9SAndroid Build Coastguard Worker   IF (ASIMD_TRUE)
20*da0073e9SAndroid Build Coastguard Worker      set(ASIMD_FOUND true CACHE BOOL "ASIMD/NEON available on host")
21*da0073e9SAndroid Build Coastguard Worker   ELSE (ASIMD_TRUE)
22*da0073e9SAndroid Build Coastguard Worker      set(ASIMD_FOUND false CACHE BOOL "ASIMD/NEON available on host")
23*da0073e9SAndroid Build Coastguard Worker   ENDIF (ASIMD_TRUE)
24*da0073e9SAndroid Build Coastguard Worker
25*da0073e9SAndroid Build Coastguard Worker   #Find the processor type (for now OMAP3 or OMAP4)
26*da0073e9SAndroid Build Coastguard Worker   STRING(REGEX REPLACE "^.*(OMAP3).*$" "\\1" OMAP3_THERE "${CPUINFO}")
27*da0073e9SAndroid Build Coastguard Worker   STRING(COMPARE EQUAL "OMAP3" "${OMAP3_THERE}" OMAP3_TRUE)
28*da0073e9SAndroid Build Coastguard Worker   IF (OMAP3_TRUE)
29*da0073e9SAndroid Build Coastguard Worker      set(CORTEXA8_FOUND true CACHE BOOL "OMAP3 available on host")
30*da0073e9SAndroid Build Coastguard Worker   ELSE (OMAP3_TRUE)
31*da0073e9SAndroid Build Coastguard Worker      set(CORTEXA8_FOUND false CACHE BOOL "OMAP3 available on host")
32*da0073e9SAndroid Build Coastguard Worker   ENDIF (OMAP3_TRUE)
33*da0073e9SAndroid Build Coastguard Worker
34*da0073e9SAndroid Build Coastguard Worker   #Find the processor type (for now OMAP3 or OMAP4)
35*da0073e9SAndroid Build Coastguard Worker   STRING(REGEX REPLACE "^.*(OMAP4).*$" "\\1" OMAP4_THERE "${CPUINFO}")
36*da0073e9SAndroid Build Coastguard Worker   STRING(COMPARE EQUAL "OMAP4" "${OMAP4_THERE}" OMAP4_TRUE)
37*da0073e9SAndroid Build Coastguard Worker   IF (OMAP4_TRUE)
38*da0073e9SAndroid Build Coastguard Worker      set(CORTEXA9_FOUND true CACHE BOOL "OMAP4 available on host")
39*da0073e9SAndroid Build Coastguard Worker   ELSE (OMAP4_TRUE)
40*da0073e9SAndroid Build Coastguard Worker      set(CORTEXA9_FOUND false CACHE BOOL "OMAP4 available on host")
41*da0073e9SAndroid Build Coastguard Worker   ENDIF (OMAP4_TRUE)
42*da0073e9SAndroid Build Coastguard Worker
43*da0073e9SAndroid Build Coastguard WorkerELSEIF(CMAKE_SYSTEM_NAME MATCHES "Darwin")
44*da0073e9SAndroid Build Coastguard Worker   IF(CMAKE_SYSTEM_PROCESSOR STREQUAL "arm64" AND NOT CMAKE_OSX_ARCHITECTURES STREQUAL "x86_64")
45*da0073e9SAndroid Build Coastguard Worker      set(NEON_FOUND true CACHE BOOL "NEON available on ARM64")
46*da0073e9SAndroid Build Coastguard Worker   ENDIF()
47*da0073e9SAndroid Build Coastguard Worker   EXECUTE_PROCESS(COMMAND /usr/sbin/sysctl -n machdep.cpu.features OUTPUT_VARIABLE
48*da0073e9SAndroid Build Coastguard Worker      CPUINFO)
49*da0073e9SAndroid Build Coastguard Worker
50*da0073e9SAndroid Build Coastguard Worker   IF(NOT CPUINFO STREQUAL "")
51*da0073e9SAndroid Build Coastguard Worker       #neon instruction can be found on the majority part of modern ARM processor
52*da0073e9SAndroid Build Coastguard Worker       STRING(REGEX REPLACE "^.*(neon).*$" "\\1" NEON_THERE "${CPUINFO}")
53*da0073e9SAndroid Build Coastguard Worker       STRING(COMPARE EQUAL "neon" "${NEON_THERE}" NEON_TRUE)
54*da0073e9SAndroid Build Coastguard Worker       IF (NEON_TRUE)
55*da0073e9SAndroid Build Coastguard Worker          set(NEON_FOUND true CACHE BOOL "NEON available on host")
56*da0073e9SAndroid Build Coastguard Worker       ELSE (NEON_TRUE)
57*da0073e9SAndroid Build Coastguard Worker          set(NEON_FOUND false CACHE BOOL "NEON available on host")
58*da0073e9SAndroid Build Coastguard Worker       ENDIF (NEON_TRUE)
59*da0073e9SAndroid Build Coastguard Worker   ENDIF()
60*da0073e9SAndroid Build Coastguard Worker
61*da0073e9SAndroid Build Coastguard WorkerELSEIF(CMAKE_SYSTEM_NAME MATCHES "Windows")
62*da0073e9SAndroid Build Coastguard Worker   # TODO
63*da0073e9SAndroid Build Coastguard Worker   set(CORTEXA8_FOUND   false CACHE BOOL "OMAP3 not available on host")
64*da0073e9SAndroid Build Coastguard Worker   set(CORTEXA9_FOUND   false CACHE BOOL "OMAP4 not available on host")
65*da0073e9SAndroid Build Coastguard Worker   set(NEON_FOUND   false CACHE BOOL "NEON not available on host")
66*da0073e9SAndroid Build Coastguard WorkerELSE(CMAKE_SYSTEM_NAME MATCHES "Linux")
67*da0073e9SAndroid Build Coastguard Worker   set(CORTEXA8_FOUND   false CACHE BOOL "OMAP3 not available on host")
68*da0073e9SAndroid Build Coastguard Worker   set(CORTEXA9_FOUND   false CACHE BOOL "OMAP4 not available on host")
69*da0073e9SAndroid Build Coastguard Worker   set(NEON_FOUND   false CACHE BOOL "NEON not available on host")
70*da0073e9SAndroid Build Coastguard WorkerENDIF(CMAKE_SYSTEM_NAME MATCHES "Linux")
71*da0073e9SAndroid Build Coastguard Worker
72*da0073e9SAndroid Build Coastguard Workerif(NOT NEON_FOUND)
73*da0073e9SAndroid Build Coastguard Worker      MESSAGE(STATUS "Could not find hardware support for NEON on this machine.")
74*da0073e9SAndroid Build Coastguard Workerendif(NOT NEON_FOUND)
75*da0073e9SAndroid Build Coastguard Workerif(NOT CORTEXA8_FOUND)
76*da0073e9SAndroid Build Coastguard Worker      MESSAGE(STATUS "No OMAP3 processor on this machine.")
77*da0073e9SAndroid Build Coastguard Workerendif(NOT CORTEXA8_FOUND)
78*da0073e9SAndroid Build Coastguard Workerif(NOT CORTEXA9_FOUND)
79*da0073e9SAndroid Build Coastguard Worker      MESSAGE(STATUS "No OMAP4 processor on this machine.")
80*da0073e9SAndroid Build Coastguard Workerendif(NOT CORTEXA9_FOUND)
81*da0073e9SAndroid Build Coastguard Workermark_as_advanced(NEON_FOUND)
82