From eac945a9cb402800154c78b7d1c1d163b0131b6b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E9=98=B3?= <657837019@qq.com> Date: Thu, 18 Jun 2026 15:22:38 +0800 Subject: [PATCH] Fix riscv generic target detection --- CMakeLists.txt | 23 ++++++++++++++++++----- README.md | 2 ++ src/bmdef.h | 15 +++++++++++---- 3 files changed, 31 insertions(+), 9 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 9e6a7ee7..0a0c1eb9 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -72,6 +72,11 @@ set(BM_HEADERS ${PROJECT_SOURCE_DIR}/src/bm.h set (CMAKE_CXX_STANDARD 17) +string(TOLOWER "${CMAKE_SYSTEM_PROCESSOR}" BM_SYSTEM_PROCESSOR_LOWER) +set(BM_TARGET_IS_X86 FALSE) +if (BM_SYSTEM_PROCESSOR_LOWER MATCHES "^(x86_64|amd64|i[3-6]86|x86)$") + set(BM_TARGET_IS_X86 TRUE) +endif() if (CMAKE_CXX_COMPILER_ID MATCHES "GNU") set(warnopt "-Wno-psabi") @@ -83,11 +88,19 @@ if (CMAKE_CXX_COMPILER_ID MATCHES "GNU" OR CMAKE_CXX_COMPILER_ID MATCHES "Clang" elseif("${BMOPTFLAGS}" STREQUAL "BMAVX2OPT") set(bmoptf "-march=skylake -mavx2 -O2 -DBMAVX2OPT") else() - if (CMAKE_BUILD_TYPE MATCHES "Release") - set(bmoptf "-march=native -O2") - else() - set(bmoptf "-march=native") - endif() + if (BM_TARGET_IS_X86 AND NOT CMAKE_CROSSCOMPILING) + if (CMAKE_BUILD_TYPE MATCHES "Release") + set(bmoptf "-march=native -O2") + else() + set(bmoptf "-march=native") + endif() + else() + if (CMAKE_BUILD_TYPE MATCHES "Release") + set(bmoptf "-O2") + else() + set(bmoptf "") + endif() + endif() endif() set(flags "-Wall -Wextra -Wno-ignored-qualifiers -fPIC -fomit-frame-pointer") diff --git a/README.md b/README.md index 5b853355..d9113c5b 100644 --- a/README.md +++ b/README.md @@ -328,6 +328,8 @@ If you want to change the default you can do that in makefile.in Project now comes with a set of makefiles for cmake, you can just build it or generate project files for any cmake-supported environment. +When targeting `riscv64`, use the default portable build unless you add a dedicated RISC-V SIMD backend. Avoid inheriting host-only `-march=native` settings during cross-target or simulated target builds. + ###### Windows: --- diff --git a/src/bmdef.h b/src/bmdef.h index db237cf3..0fbd4d15 100644 --- a/src/bmdef.h +++ b/src/bmdef.h @@ -56,20 +56,27 @@ For more information please visit: http://bitmagic.io #endif +#if defined(__riscv) +#define BM_RISCV +#endif + + // macro to define/undefine unaligned memory access (x86, PowerPC) // -#if defined(__i386) || defined(__x86_64) || defined(__ppc__) || \ +#if !defined(BM_RISCV) && \ + (defined(__i386) || defined(__x86_64) || defined(__ppc__) || \ defined(__ppc64__) || defined(_M_IX86) || defined(_M_AMD64) || \ defined(_M_IX86) || defined(_M_AMD64) || defined(_M_X64) || \ defined(_M_ARM) || defined(_M_ARM64) || \ defined(__arm__) || defined(__aarch64__) || \ - (defined(_M_MPPC) && !defined(BM_FORBID_UNALIGNED_ACCESS)) + (defined(_M_MPPC) && !defined(BM_FORBID_UNALIGNED_ACCESS))) #define BM_UNALIGNED_ACCESS_OK 1 #endif -#if defined(_M_IX86) || defined(_M_AMD64) || defined(_M_X64) || \ +#if !defined(BM_RISCV) && \ + (defined(_M_IX86) || defined(_M_AMD64) || defined(_M_X64) || \ defined(__i386) || defined(__x86_64) || defined(_M_AMD64) || \ - defined(BMSSE2OPT) || defined(BMSSE42OPT) + defined(BMSSE2OPT) || defined(BMSSE42OPT)) #define BM_x86 #endif