set_property(CACHE WITH_SANITIZER PROPERTY STRINGS "Memory" "Address" "Undefined" "Thread")
if(BASEARCH_ARM_FOUND)
- cmake_dependent_option(WITH_ARMV6 "Build with ARMv6 SIMD" ON "NOT ARCH MATCHES \"aarch64\"" OFF)
+ cmake_dependent_option(WITH_ARMV6 "Build with ARMv6 SIMD" ON ARCH_32BIT OFF)
option(WITH_ARMV8 "Build with ARMv8 CRC32 intrinsics" ON)
option(WITH_NEON "Build with NEON intrinsics" ON)
set(WARNFLAGS_DISABLE /wd4206 /wd4054 /wd4324)
if(BASEARCH_ARM_FOUND)
add_definitions(-D_ARM_WINAPI_PARTITION_DESKTOP_SDK_AVAILABLE)
- if(NOT "${ARCH}" MATCHES "aarch64")
+ if(ARCH_32BIT)
set(NEONFLAG "/arch:VFPv4")
endif()
endif()
endif()
if(NOT WITH_NATIVE_INSTRUCTIONS)
if(BASEARCH_ARM_FOUND)
- if("${ARCH}" MATCHES "arm" AND NOT CMAKE_C_FLAGS MATCHES "-mfloat-abi")
+ if(ARCH_32BIT AND NOT CMAKE_C_FLAGS MATCHES "-mfloat-abi")
# Auto-detect support for ARM floating point ABI
check_include_file(features.h HAVE_FEATURES_H)
if(HAVE_FEATURES_H)
set(ARCHDIR "arch/loongarch")
elseif(BASEARCH_X86_FOUND)
set(ARCHDIR "arch/x86")
- if(NOT ${ARCH} MATCHES "x86_64")
+ if(ARCH_32BIT)
add_feature_info(SSE2 1 "Support the SSE2 instruction set, using \"${SSE2FLAG}\"")
endif()
else()
if(BASEARCH_ARM_FOUND)
add_definitions(-DARM_FEATURES)
if(${CMAKE_SYSTEM_NAME} STREQUAL "Linux")
- if("${ARCH}" MATCHES "aarch64")
+ if(ARCH_64BIT)
check_c_source_compiles(
"#include <sys/auxv.h>
int main() {
endif()
if(${CMAKE_SYSTEM_NAME} STREQUAL "FreeBSD" OR
${CMAKE_SYSTEM_NAME} STREQUAL "OpenBSD")
- if("${ARCH}" MATCHES "aarch64")
+ if(ARCH_64BIT)
check_c_source_compiles(
"#include <sys/auxv.h>
int main() {
if(HAVE_POWER8_INTRIN)
add_definitions(-DPOWER8_VSX)
set(POWER8_SRCS ${ARCHDIR}/adler32_power8.c ${ARCHDIR}/chunkset_power8.c ${ARCHDIR}/slide_hash_power8.c)
- if("${ARCH}" MATCHES "powerpc64(le)?")
+ if(ARCH_64BIT)
add_definitions(-DPOWER8_VSX_CRC32)
list(APPEND POWER8_SRCS ${ARCHDIR}/crc32_power8.c)
endif()
add_definitions(-DX86_SSE2)
set(SSE2_SRCS ${ARCHDIR}/chunkset_sse2.c ${ARCHDIR}/chorba_sse2.c ${ARCHDIR}/compare256_sse2.c ${ARCHDIR}/slide_hash_sse2.c)
list(APPEND ZLIB_ARCH_SRCS ${SSE2_SRCS})
- if(NOT ${ARCH} MATCHES "x86_64")
+ if(ARCH_32BIT)
set_property(SOURCE ${SSE2_SRCS} PROPERTY COMPILE_FLAGS "${SSE2FLAG} ${NOLTOFLAG}")
endif()
else()
if(WITH_ALL_FALLBACKS)
list(APPEND ZLIB_GENERIC_SRCS ${ZLIB_ALL_FALLBACK_SRCS})
add_definitions(-DWITH_ALL_FALLBACKS)
-elseif(${ARCH} STREQUAL "x86_64" AND WITH_SSE2)
+elseif(BASEARCH_X86_FOUND AND ARCH_64BIT AND WITH_SSE2)
# x86_64 always has SSE2, so let the SSE2 functions act as fallbacks.
list(APPEND ZLIB_GENERIC_SRCS
arch/generic/adler32_c.c
# detect-arch.cmake -- Detect compiler architecture and set ARCH and BASEARCH
# Copyright (C) 2019 Hans Kristian Rosbach
# Licensed under the Zlib license, see LICENSE.md for details
-set(ARCHDETECT_FOUND TRUE)
-
if(CMAKE_OSX_ARCHITECTURES)
# If multiple architectures are requested (universal build), pick only the first
list(GET CMAKE_OSX_ARCHITECTURES 0 ARCH)
elseif(MSVC)
- if("${MSVC_C_ARCHITECTURE_ID}" STREQUAL "X86")
- set(ARCH "i686")
- elseif("${MSVC_C_ARCHITECTURE_ID}" STREQUAL "x64")
- set(ARCH "x86_64")
- elseif("${MSVC_C_ARCHITECTURE_ID}" STREQUAL "ARM" OR "${MSVC_C_ARCHITECTURE_ID}" STREQUAL "ARMV7")
- set(ARCH "arm")
- elseif ("${MSVC_C_ARCHITECTURE_ID}" STREQUAL "ARM64" OR "${MSVC_C_ARCHITECTURE_ID}" STREQUAL "ARM64EC")
- set(ARCH "aarch64")
- endif()
+ set(ARCH ${MSVC_C_ARCHITECTURE_ID})
elseif(EMSCRIPTEN)
set(ARCH "wasm32")
elseif(CMAKE_CROSSCOMPILING)
message(STATUS "Arch detected: '${ARCH}'")
endif()
+# Convert ARCH to lowercase
+string(TOLOWER "${ARCH}" ARCH)
+
# Base arch detection
-if("${ARCH}" MATCHES "(x86_64|AMD64|i[3-6]86)")
+if("${ARCH}" MATCHES "(x86(_32|_64)?|amd64|x64|i[3-6]86)")
set(BASEARCH "x86")
set(BASEARCH_X86_FOUND TRUE)
-elseif("${ARCH}" MATCHES "(arm(v[0-9])?|aarch64|cortex)")
+ if("${ARCH}" MATCHES "(x86_64|amd64|x64)")
+ set(ARCH_BITS 64)
+ else()
+ set(ARCH_BITS 32)
+ endif()
+elseif("${ARCH}" MATCHES "(aarch64|arm64(ec)?|aarch32|arm(v[0-9])?|cortex)")
set(BASEARCH "arm")
set(BASEARCH_ARM_FOUND TRUE)
-elseif("${ARCH}" MATCHES "ppc(64(le)?)?|powerpc(64(le)?)?")
+ if("${ARCH}" MATCHES "(aarch64|arm64(ec)?)")
+ set(ARCH_BITS 64)
+ else()
+ set(ARCH_BITS 32)
+ endif()
+elseif("${ARCH}" MATCHES "(ppc|powerpc)(64)?(le)?")
set(BASEARCH "ppc")
set(BASEARCH_PPC_FOUND TRUE)
+ if("${ARCH}" MATCHES "(ppc|powerpc)64(le)?")
+ set(ARCH_BITS 64)
+ else()
+ set(ARCH_BITS 32)
+ endif()
elseif("${ARCH}" MATCHES "alpha")
set(BASEARCH "alpha")
set(BASEARCH_ALPHA_FOUND TRUE)
+ set(ARCH_BITS 64)
elseif("${ARCH}" MATCHES "blackfin")
set(BASEARCH "blackfin")
set(BASEARCH_BLACKFIN_FOUND TRUE)
+ set(ARCH_BITS 32)
elseif("${ARCH}" MATCHES "ia64")
set(BASEARCH "ia64")
set(BASEARCH_IA64_FOUND TRUE)
-elseif("${ARCH}" MATCHES "mips")
+ set(ARCH_BITS 64)
+elseif("${ARCH}" MATCHES "mips(isa)?(64)?")
set(BASEARCH "mips")
set(BASEARCH_MIPS_FOUND TRUE)
+ if("${ARCH}" MATCHES "mips(isa)?64")
+ set(ARCH_BITS 64)
+ else()
+ set(ARCH_BITS 32)
+ endif()
elseif("${ARCH}" MATCHES "m68k")
set(BASEARCH "m68k")
set(BASEARCH_M68K_FOUND TRUE)
+ set(ARCH_BITS 32)
elseif("${ARCH}" MATCHES "sh")
set(BASEARCH "sh")
set(BASEARCH_SH_FOUND TRUE)
-elseif("${ARCH}" MATCHES "sparc[89]?")
+ set(ARCH_BITS 32)
+elseif("${ARCH}" MATCHES "sparc(v)?[89]?(64)?")
set(BASEARCH "sparc")
set(BASEARCH_SPARC_FOUND TRUE)
+ if("${ARCH}" MATCHES "(sparc64|sparc(v)?9)")
+ set(ARCH_BITS 64)
+ else()
+ set(ARCH_BITS 32)
+ endif()
elseif("${ARCH}" MATCHES "s3[679]0x?")
set(BASEARCH "s360")
set(BASEARCH_S360_FOUND TRUE)
-elseif("${ARCH}" MATCHES "parisc")
+ if("${ARCH}" MATCHES "s3[679]0x")
+ set(ARCH_BITS 64)
+ else()
+ set(ARCH_BITS 32)
+ endif()
+elseif("${ARCH}" MATCHES "(parisc|hppa)(64)?")
set(BASEARCH "parisc")
set(BASEARCH_PARISC_FOUND TRUE)
+ if("${ARCH}" MATCHES "(parisc|hppa)64")
+ set(ARCH_BITS 64)
+ else()
+ set(ARCH_BITS 32)
+ endif()
elseif("${ARCH}" MATCHES "rs6000")
set(BASEARCH "rs6000")
set(BASEARCH_RS6000_FOUND TRUE)
+ set(ARCH_BITS 32)
elseif("${ARCH}" MATCHES "riscv(32|64)")
set(BASEARCH "riscv")
set(BASEARCH_RISCV_FOUND TRUE)
-elseif("${ARCH}" MATCHES "loongarch64")
+ if("${ARCH}" MATCHES "riscv64")
+ set(ARCH_BITS 64)
+ else()
+ set(ARCH_BITS 32)
+ endif()
+elseif("${ARCH}" MATCHES "(loong64|loongarch64)")
set(BASEARCH "loongarch")
set(BASEARCH_LOONGARCH_FOUND TRUE)
-elseif("${ARCH}" MATCHES "wasm32")
+ set(ARCH_BITS 64)
+elseif("${ARCH}" MATCHES "wasm(32|64)")
set(BASEARCH "wasm32")
set(BASEARCH_WASM32_FOUND TRUE)
+ if("${ARCH}" MATCHES "wasm64")
+ set(ARCH_BITS 64)
+ else()
+ set(ARCH_BITS 32)
+ endif()
else()
set(BASEARCH "x86")
set(BASEARCH_X86_FOUND TRUE)
+ set(ARCH_BITS 32)
message(STATUS "Basearch '${ARCH}' not recognized, defaulting to 'x86'.")
endif()
-message(STATUS "Basearch of '${ARCH}' has been detected as: '${BASEARCH}'")
+
+if (ARCH_BITS EQUAL 64)
+ set(ARCH_64BIT TRUE)
+ set(ARCH_32BIT FALSE)
+else()
+ set(ARCH_64BIT FALSE)
+ set(ARCH_32BIT TRUE)
+endif()
+
+message(STATUS "Basearch of '${ARCH}' (${ARCH_BITS}bit) has been detected as: '${BASEARCH}'")
macro(check_neon_compiler_flag)
if(NOT NATIVEFLAG)
if(CMAKE_C_COMPILER_ID MATCHES "GNU" OR CMAKE_C_COMPILER_ID MATCHES "Clang")
- if("${ARCH}" MATCHES "aarch64")
+ if(ARCH_64BIT)
set(NEONFLAG "-march=armv8-a+simd")
else()
set(NEONFLAG "-mfpu=neon")
NEON_AVAILABLE FAIL_REGEX "not supported")
# Check whether compiler native flag is enough for NEON support
# Some GCC versions don't enable FPU (vector unit) when using -march=native
- if(NEON_AVAILABLE AND NATIVEFLAG AND (NOT "${ARCH}" MATCHES "aarch64"))
+ if(NEON_AVAILABLE AND NATIVEFLAG AND ARCH_32BIT)
check_c_source_compiles(
"#include <arm_neon.h>
uint8x16_t f(uint8x16_t x, uint8x16_t y) {
macro(check_neon_ld4_intrinsics)
if(NOT NATIVEFLAG)
if(CMAKE_C_COMPILER_ID MATCHES "GNU" OR CMAKE_C_COMPILER_ID MATCHES "Clang")
- if("${ARCH}" MATCHES "aarch64")
+ if(ARCH_64BIT)
set(NEONFLAG "-march=armv8-a+simd")
else()
set(NEONFLAG "-mfpu=neon")
endif()
endif()
# Check whether compiler supports PCLMULQDQ intrinsics
- if(NOT (APPLE AND "${ARCH}" MATCHES "i386"))
+ if(NOT (APPLE AND ARCH_32BIT))
# The pclmul code currently crashes on Mac in 32bit mode. Avoid for now.
set(CMAKE_REQUIRED_FLAGS "${PCLMULFLAG} ${NATIVEFLAG} ${ZNOLTOFLAG}")
check_c_source_compiles(
endif()
endif()
# Check whether compiler supports VPCLMULQDQ intrinsics
- if(NOT (APPLE AND "${ARCH}" MATCHES "i386"))
+ if(NOT (APPLE AND ARCH_32BIT))
set(CMAKE_REQUIRED_FLAGS "${VPCLMULFLAG} ${NATIVEFLAG} ${ZNOLTOFLAG}")
check_c_source_compiles(
"#include <immintrin.h>
set(SSE2FLAG "/arch:SSE2")
endif()
elseif(MSVC)
- if(NOT "${ARCH}" MATCHES "x86_64")
+ if(ARCH_32BIT)
set(SSE2FLAG "/arch:SSE2")
endif()
elseif(CMAKE_C_COMPILER_ID MATCHES "GNU" OR CMAKE_C_COMPILER_ID MATCHES "Clang" OR CMAKE_C_COMPILER_ID MATCHES "NVHPC")