rvthtool/cmake/macros/CPUInstructionSetFlags.cmake
2024-04-26 21:30:17 -04:00

108 lines
3.8 KiB
CMake

# Determine CPU architecture.
IF(MSVC AND _MSVC_C_ARCHITECTURE_FAMILY)
# Check the MSVC architecture.
# Set CMAKE_SYSTEM_PROCESSOR to match, since it doesn't get
# set to the target architecture correctly.
# TODO: Verify 32-bit.
IF(_MSVC_C_ARCHITECTURE_FAMILY MATCHES "^[iI]?[xX3]86$")
SET(CPU_i386 1)
SET(CMAKE_SYSTEM_PROCESSOR "x86")
SET(WIN32_MANIFEST_PROCESSOR_ARCHITECTURE "x86")
ELSEIF(_MSVC_C_ARCHITECTURE_FAMILY MATCHES "^[xX]64$")
SET(CPU_amd64 1)
SET(CMAKE_SYSTEM_PROCESSOR "AMD64")
SET(WIN32_MANIFEST_PROCESSOR_ARCHITECTURE "amd64")
ELSEIF(_MSVC_C_ARCHITECTURE_FAMILY MATCHES "[iI][aA]64")
SET(CPU_ia64 1)
SET(CMAKE_SYSTEM_PROCESSOR "IA64")
SET(WIN32_MANIFEST_PROCESSOR_ARCHITECTURE "ia64")
ELSEIF(_MSVC_C_ARCHITECTURE_FAMILY STREQUAL "ARM" OR _MSVC_C_ARCHITECTURE_FAMILY STREQUAL "ARMV7")
SET(CPU_arm 1)
SET(CMAKE_SYSTEM_PROCESSOR "ARM")
SET(WIN32_MANIFEST_PROCESSOR_ARCHITECTURE "arm")
ELSEIF(_MSVC_C_ARCHITECTURE_FAMILY STREQUAL "ARM64EC")
SET(CPU_arm64 1)
SET(CPU_arm64ec 1)
SET(CMAKE_SYSTEM_PROCESSOR "ARM64")
# TODO: Does this change for ARM64EC?
SET(WIN32_MANIFEST_PROCESSOR_ARCHITECTURE "arm64")
ELSEIF(_MSVC_C_ARCHITECTURE_FAMILY STREQUAL "ARM64")
SET(CPU_arm64 1)
SET(CMAKE_SYSTEM_PROCESSOR "ARM64")
SET(WIN32_MANIFEST_PROCESSOR_ARCHITECTURE "arm64")
ELSE()
MESSAGE(FATAL_ERROR "Unsupported value for _MSVC_C_ARCHITECTURE_FAMILY: ${_MSVC_C_ARCHITECTURE_FAMILY}")
ENDIF()
ELSE()
# TODO: Verify cross-compile functionality.
# TODO: ARM/ARM64 is untested.
STRING(TOLOWER "${CMAKE_SYSTEM_PROCESSOR}" arch)
IF(arch MATCHES "^(i.|x)86$|^x86_64$|^amd64$")
IF(CMAKE_CL_64 OR ("${CMAKE_SIZEOF_VOID_P}" EQUAL 8))
SET(CPU_amd64 1)
SET(WIN32_MANIFEST_PROCESSOR_ARCHITECTURE "amd64")
ELSE()
SET(CPU_i386 1)
SET(WIN32_MANIFEST_PROCESSOR_ARCHITECTURE "x86")
ENDIF()
ELSEIF(arch STREQUAL "ia64")
SET(CPU_ia64 1)
SET(WIN32_MANIFEST_PROCESSOR_ARCHITECTURE "ia64")
ELSEIF(arch MATCHES "^arm(|v[1-7](.|h[fl]|hfe[lb]))?$" OR arch STREQUAL "aarch64" OR arch STREQUAL "arm64" OR arch STREQUAL "cortex")
IF(CMAKE_CL_64 OR ("${CMAKE_SIZEOF_VOID_P}" EQUAL 8))
SET(CPU_arm64 1)
SET(WIN32_MANIFEST_PROCESSOR_ARCHITECTURE "arm64")
ELSE()
SET(CPU_arm 1)
SET(WIN32_MANIFEST_PROCESSOR_ARCHITECTURE "arm")
ENDIF()
ELSEIF(arch MATCHES "^ppc" OR arch STREQUAL "powerpc")
IF(arch STREQUAL "ppc64le")
SET(CPU_ppc64le 1)
SET(WIN32_MANIFEST_PROCESSOR_ARCHITECTURE "ppc64le")
ELSEIF(CMAKE_CL_64 OR ("${CMAKE_SIZEOF_VOID_P}" EQUAL 8))
SET(CPU_ppc64 1)
SET(WIN32_MANIFEST_PROCESSOR_ARCHITECTURE "ppc64")
ELSE()
SET(CPU_ppc 1)
SET(WIN32_MANIFEST_PROCESSOR_ARCHITECTURE "ppc")
ENDIF()
ELSEIF(arch MATCHES "^riscv")
# TODO: Win32 manifest processor architecture, if it's ever ported to RISC-V.
IF(CMAKE_CL_64 OR ("${CMAKE_SIZEOF_VOID_P}" EQUAL 8))
SET(CPU_riscv64 1)
SET(WIN32_MANIFEST_PROCESSOR_ARCHITECTURE "riscv64")
ELSE()
SET(CPU_riscv32 1)
SET(WIN32_MANIFEST_PROCESSOR_ARCHITECTURE "riscv32")
ENDIF()
ELSE()
MESSAGE(FATAL_ERROR "Unable to determine CPU architecture.\nCMAKE_SYSTEM_PROCESSOR == ${CMAKE_SYSTEM_PROCESSOR}")
ENDIF()
UNSET(arch)
ENDIF()
# i386/amd64: Flags for extended instruction sets.
IF(CPU_i386 OR CPU_amd64)
# MSVC does not require anything past /arch:SSE2 for SSSE3.
# ClangCL does require -mssse3, even on 64-bit.
IF(MSVC)
IF(CPU_i386)
SET(SSE2_FLAG "/arch:SSE2")
SET(SSSE3_FLAG "/arch:SSE2")
SET(SSE41_FLAG "/arch:SSE2")
ENDIF(CPU_i386)
IF(CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
SET(SSSE3_FLAG "-mssse3")
SET(SSE41_FLAG "-msse4.1")
ENDIF(CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
ELSE()
IF(CPU_i386)
SET(MMX_FLAG "-mmmx")
SET(SSE2_FLAG "-msse2")
ENDIF(CPU_i386)
SET(SSSE3_FLAG "-mssse3")
SET(SSE41_FLAG "-msse4.1")
ENDIF()
ENDIF(CPU_i386 OR CPU_amd64)