# If multiple architectures are requested (universal build), pick only the first
list(GET CMAKE_OSX_ARCHITECTURES 0 ARCH)
else()
- set(ARCH ${CMAKE_SYSTEM_PROCESSOR})
+ if (MSVC)
+ if("${MSVC_C_ARCHITECTURE_ID}" STREQUAL "ARM" OR "${MSVC_C_ARCHITECTURE_ID}" STREQUAL "ARMV7")
+ set(ARCH "arm")
+ elseif ("${MSVC_C_ARCHITECTURE_ID}" STREQUAL "ARM64")
+ set(ARCH "aarch64")
+ endif()
+ endif()
+ if(NOT ARCH)
+ set(ARCH ${CMAKE_SYSTEM_PROCESSOR})
+ endif()
endif()
message(STATUS "Architecture: ${ARCH}")
if(CMAKE_TOOLCHAIN_FILE)
set(SSE2FLAG "/arch:SSE2")
endif()
if("${ARCH}" MATCHES "arm")
- add_definitions("-D_ARM_WINAPI_PARTITION_DESKTOP_SDK_AVAILABLE=1")
+ add_definitions(-D_ARM_WINAPI_PARTITION_DESKTOP_SDK_AVAILABLE)
set(NEONFLAG "/arch:VFPv4")
endif()
if(WITH_NATIVE_INSTRUCTIONS)
message(STATUS "Ignoring WITH_NATIVE_INSTRUCTIONS; not implemented yet on this configuration")
endif()
endif()
- if(__GNUC__ AND "${ARCH}" MATCHES "arm")
- execute_process(COMMAND ${CMAKE_C_COMPILER} "-dumpmachine"
- OUTPUT_VARIABLE GCC_MACHINE)
- if ("${GCC_MACHINE}" MATCHES "eabihf")
- set(FLOATABI "-mfloat-abi=hard")
+ # Check support for ARM floating point
+ if("${ARCH}" MATCHES "arm")
+ if (__GNUC__)
+ execute_process(COMMAND ${CMAKE_C_COMPILER} "-dumpmachine"
+ OUTPUT_VARIABLE GCC_MACHINE)
+ if ("${GCC_MACHINE}" MATCHES "eabihf")
+ set(FLOATABI "-mfloat-abi=hard")
+ else()
+ set(FLOATABI "-mfloat-abi=softfp")
+ endif()
+ endif()
+ # Check whether -mfpu=neon is available
+ set(CMAKE_REQUIRED_FLAGS "-mfpu=neon")
+ check_c_source_compiles(
+ "int main() { return 0; }"
+ MFPU_NEON_AVAILABLE FAIL_REGEX "not supported")
+ set(CMAKE_REQUIRED_FLAGS)
+ if(MFPU_NEON_AVAILABLE)
+ set(NEONFLAG "${FLOATABI} -mfpu=neon")
else()
- set(FLOATABI "-mfloat-abi=softfp")
+ set(NEONFLAG "${FLOATABI}")
endif()
endif()
if(NOT NATIVEFLAG)
endif()
if("${ARCH}" MATCHES "arm")
set(ACLEFLAG "-march=armv8-a+crc")
- set(NEONFLAG "${FLOATABI} -mfpu=neon")
elseif("${ARCH}" MATCHES "aarch64")
set(ACLEFLAG "-march=armv8-a+crc")
set(NEONFLAG "-march=armv8-a+crc+simd")
set(PCLMULFLAG ${NATIVEFLAG})
if("${ARCH}" MATCHES "arm")
set(ACLEFLAG "${NATIVEFLAG}")
- set(NEONFLAG "${FLOATABI} -mfpu=neon")
elseif("${ARCH}" MATCHES "aarch64")
set(ACLEFLAG "${NATIVEFLAG}")
set(NEONFLAG "${NATIVEFLAG}")
endif()
set(CMAKE_REQUIRED_FLAGS)
-# Check whether -mfpu=neon is available
-set(CMAKE_REQUIRED_FLAGS "-mfpu=neon")
-check_c_source_compiles(
- "int main()
- {
- return 0;
- }"
- MFPU_NEON_AVAILABLE FAIL_REGEX "not supported")
-set(CMAKE_REQUIRED_FLAGS)
-
# FORCE_SSE2 option will only be shown if HAVE_SSE2_INTRIN is true
if("${ARCH}" MATCHES "i[3-6]86")
cmake_dependent_option(FORCE_SSE2 "Always assume CPU is SSE2 capable" OFF "HAVE_SSE2_INTRIN" OFF)
set(ZLIB_ARCH_SRCS ${ZLIB_ARCH_SRCS} ${ARCHDIR}/armfeature.c ${ARCHDIR}/fill_window_arm.c)
endif()
if(WITH_OPTIM)
- if("${ARCH}" MATCHES "arm")
- if(WITH_ACLE)
- set(ZLIB_ARCH_SRCS ${ZLIB_ARCH_SRCS} ${ARCHDIR}/crc32_acle.c ${ARCHDIR}/insert_string_acle.c)
- set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${ACLEFLAG}")
- add_definitions("-DARM_ACLE_CRC_HASH")
- add_feature_info(ACLE_CRC 1 "Support CRC hash generation using the ACLE instruction set, using \"${ACLEFLAG}\"")
- endif()
+ if("${ARCH}" MATCHES "arm" OR "${ARCH}" MATCHES "aarch64")
if(WITH_NEON)
- if(MFPU_NEON_AVAILABLE)
- set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${NEONFLAG}")
- endif()
- add_definitions("-DARM_NEON_ADLER32")
- if(MSVC)
- add_definitions("-D__ARM_NEON__=1")
- endif(MSVC)
set(ZLIB_ARCH_SRCS ${ZLIB_ARCH_SRCS} ${ARCHDIR}/adler32_neon.c)
+ add_definitions(-DARM_NEON_ADLER32)
+ add_intrinsics_option("${NEONFLAG}")
+ if(MSVC)
+ add_definitions(-D__ARM_NEON__)
+ endif()
add_feature_info(NEON_FILLWINDOW 1 "Support NEON instructions in fill_window_arm, using \"${NEONFLAG}\"")
endif()
- elseif("${ARCH}" MATCHES "aarch64")
if(WITH_ACLE)
set(ZLIB_ARCH_SRCS ${ZLIB_ARCH_SRCS} ${ARCHDIR}/crc32_acle.c ${ARCHDIR}/insert_string_acle.c)
- add_definitions("-DARM_ACLE_CRC_HASH")
+ add_definitions(-DARM_ACLE_CRC_HASH)
+ # For ARM aarch64, we need to check WITH_NEON first
+ if("${ARCH}" MATCHES "arm" OR NOT WITH_NEON)
+ add_intrinsics_option("${ACLEFLAG}")
+ endif()
add_feature_info(ACLE_CRC 1 "Support CRC hash generation using the ACLE instruction set, using \"${ACLEFLAG}\"")
endif()
- # We need to check WITH_NEON first
- if(WITH_NEON)
- add_definitions("-DARM_NEON_ADLER32")
- set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${NEONFLAG}")
- set(ZLIB_ARCH_SRCS ${ZLIB_ARCH_SRCS} ${ARCHDIR}/adler32_neon.c)
- add_feature_info(NEON_FILLWINDOW 1 "Support NEON instructions in fill_window_arm, using \"${NEONFLAG}\"")
- elseif(WITH_ACLE)
- set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${ACLEFLAG}")
- endif()
elseif("${ARCHDIR}" MATCHES "arch/x86")
add_definitions("-DX86_CPUID")
set(ZLIB_ARCH_SRCS ${ZLIB_ARCH_SRCS} ${ARCHDIR}/x86.c)