From acbd20859bf1e069e4bbcca7984f7f1f5e1268bc Mon Sep 17 00:00:00 2001 From: David Korth Date: Sun, 13 Apr 2025 11:47:13 -0400 Subject: [PATCH] [cmake] CPUInstructionSetFlags.cmake: Check for arm_neon.h when building for ARM. [librpbyteswap,librptexture] If arm_neon.h isn't available, don't compile any NEON-optimized functions. Just in case someone wants to build rom-properties for an ancient ARM system that was introduced before NEON... --- cmake/macros/CPUInstructionSetFlags.cmake | 7 ++++++ src/librpbyteswap/CMakeLists.txt | 5 +++- src/librpbyteswap/byteswap_neon.c | 2 +- src/librpbyteswap/byteswap_rp.h | 24 ++++++++++--------- src/librpbyteswap/config.byteswap.h.in | 5 +++- src/librptexture/CMakeLists.txt | 4 +++- src/librptexture/config.librptexture.h.in | 5 +++- .../decoder/ImageDecoder_common.hpp | 14 +++++++---- 8 files changed, 45 insertions(+), 21 deletions(-) diff --git a/cmake/macros/CPUInstructionSetFlags.cmake b/cmake/macros/CPUInstructionSetFlags.cmake index e3553fda0..979d86f85 100644 --- a/cmake/macros/CPUInstructionSetFlags.cmake +++ b/cmake/macros/CPUInstructionSetFlags.cmake @@ -110,3 +110,10 @@ IF(CPU_i386 OR CPU_amd64) SET(SSE41_FLAG "-msse4.1") ENDIF() ENDIF(CPU_i386 OR CPU_amd64) + +IF(CPU_arm OR CPU_arm64 OR CPU_arm64ec) + # Check for arm_neon.h. + # NOTE: Should always be present for arm64, but check anyway. + INCLUDE(CheckIncludeFile) + CHECK_INCLUDE_FILE("arm_neon.h" HAVE_ARM_NEON_H) +ENDIF(CPU_arm OR CPU_arm64 OR CPU_arm64ec) diff --git a/src/librpbyteswap/CMakeLists.txt b/src/librpbyteswap/CMakeLists.txt index 7b19bb064..9ae693ae5 100644 --- a/src/librpbyteswap/CMakeLists.txt +++ b/src/librpbyteswap/CMakeLists.txt @@ -48,8 +48,11 @@ IF(CPU_i386 OR CPU_amd64) SET(${PROJECT_NAME}_CPU_SRCS ${${PROJECT_NAME}_MMX_SRCS} ${${PROJECT_NAME}_SSE2_SRCS} ${${PROJECT_NAME}_SSSE3_SRCS}) ELSEIF(CPU_arm OR CPU_arm64) - SET(${PROJECT_NAME}_CPU_SRCS byteswap_neon.c) + IF(HAVE_ARM_NEON_H) + SET(${PROJECT_NAME}_CPU_SRCS byteswap_neon.c) + ENDIF(HAVE_ARM_NEON_H) ENDIF() +UNSET(arch) # gcc byteswapping intrinsics. IF(NOT MSVC) diff --git a/src/librpbyteswap/byteswap_neon.c b/src/librpbyteswap/byteswap_neon.c index 8ace9517a..659b2b4ef 100644 --- a/src/librpbyteswap/byteswap_neon.c +++ b/src/librpbyteswap/byteswap_neon.c @@ -1,6 +1,6 @@ /*************************************************************************** * ROM Properties Page shell extension. (librpbyteswap) * - * byteswap_neon.c: Byteswapping functions. * + * byteswap_arm64.c: Byteswapping functions. * * NEON-optimized version. * * * * Copyright (c) 2008-2025 by David Korth * diff --git a/src/librpbyteswap/byteswap_rp.h b/src/librpbyteswap/byteswap_rp.h index 64d16674a..8402eeb37 100644 --- a/src/librpbyteswap/byteswap_rp.h +++ b/src/librpbyteswap/byteswap_rp.h @@ -39,13 +39,15 @@ #ifdef RP_CPU_AMD64 # define BYTESWAP_ALWAYS_HAS_SSE2 1 #endif /* RP_CPU_AMD64 */ -#if defined(RP_CPU_ARM) || defined(RP_CPU_ARM64) -# include "librpcpuid/cpuflags_arm.h" -# define BYTESWAP_HAS_NEON 1 -#endif -#ifdef RP_CPU_ARM64 -# define BYTESWAP_ALWAYS_HAS_NEON 1 -#endif /* RP_CPU_ARM64 */ +#ifdef HAVE_ARM_NEON_H +# if defined(RP_CPU_ARM) || defined(RP_CPU_ARM64) +# include "librpcpuid/cpuflags_arm.h" +# define BYTESWAP_HAS_NEON 1 +# endif +# ifdef RP_CPU_ARM64 +# define BYTESWAP_ALWAYS_HAS_NEON 1 +# endif /* RP_CPU_ARM64 */ +#endif /* HAVE_ARM_NEON_H */ #if defined(_MSC_VER) @@ -296,12 +298,12 @@ static FORCEINLINE void rp_byte_swap_16_array(uint16_t *ptr, size_t n) if (RP_CPU_arm_HasNEON()) { rp_byte_swap_16_array_neon(ptr, n); } else -# endif /* BYTESWAP_HAS_NEON */ +# endif /* BYTESWAP_HAS_SSE2 */ // TODO: MMX-optimized version? { rp_byte_swap_16_array_c(ptr, n); } -#endif +#endif /* BYTESWAP_ALWAYS_HAS_SSE2 */ } /** @@ -344,11 +346,11 @@ static FORCEINLINE void rp_byte_swap_32_array(uint32_t *ptr, size_t n) if (RP_CPU_arm_HasNEON()) { rp_byte_swap_32_array_neon(ptr, n); } else -# endif /* BYTESWAP_HAS_NEON */ +# endif /* BYTESWAP_HAS_SSE2 */ { rp_byte_swap_32_array_c(ptr, n); } -#endif +#endif /* !BYTESWAP_ALWAYS_HAS_SSE2 */ } #ifdef __cplusplus diff --git a/src/librpbyteswap/config.byteswap.h.in b/src/librpbyteswap/config.byteswap.h.in index 1f44a46d3..abf71d9f7 100644 --- a/src/librpbyteswap/config.byteswap.h.in +++ b/src/librpbyteswap/config.byteswap.h.in @@ -2,7 +2,7 @@ * ROM Properties Page shell extension. (librpbyteswap) * * config.byteswap.h.in: Byteswap intrinsics configuration. (source file) * * * - * Copyright (c) 2016-2024 by David Korth. * + * Copyright (c) 2016-2025 by David Korth. * * SPDX-License-Identifier: GPL-2.0-or-later * ***************************************************************************/ @@ -11,6 +11,9 @@ /* Define to 1 if you have the header file. */ #cmakedefine HAVE_FEATURES_H 1 +/* Define to 1 if you have the header file. */ +#cmakedefine HAVE_ARM_NEON_H 1 + /* Define to 1 if you have __builtin_bswap16(). */ #cmakedefine HAVE___BUILTIN_BSWAP16 1 diff --git a/src/librptexture/CMakeLists.txt b/src/librptexture/CMakeLists.txt index 8f6b86145..804c9a449 100644 --- a/src/librptexture/CMakeLists.txt +++ b/src/librptexture/CMakeLists.txt @@ -199,7 +199,9 @@ IF(CPU_i386 OR CPU_amd64) ${${PROJECT_NAME}_SSE41_SRCS} ) ELSEIF(CPU_arm OR CPU_arm64) - SET(${PROJECT_NAME}_CPU_SRCS decoder/ImageDecoder_Linear_neon.cpp) + IF(HAVE_ARM_NEON_H) + SET(${PROJECT_NAME}_CPU_SRCS decoder/ImageDecoder_Linear_neon.cpp) + ENDIF(HAVE_ARM_NEON_H) ENDIF() UNSET(arch) diff --git a/src/librptexture/config.librptexture.h.in b/src/librptexture/config.librptexture.h.in index f8505c759..9fd5536e6 100644 --- a/src/librptexture/config.librptexture.h.in +++ b/src/librptexture/config.librptexture.h.in @@ -2,12 +2,15 @@ * ROM Properties Page shell extension. (librptexture) * * config.librptexture.h.in: LibRpTexture configuration. (source file) * * * - * Copyright (c) 2016-2023 by David Korth. * + * Copyright (c) 2016-2025 by David Korth. * * SPDX-License-Identifier: GPL-2.0-or-later * ***************************************************************************/ #pragma once +/* Define to 1 if you have the header file. */ +#cmakedefine HAVE_ARM_NEON_H 1 + /* Define to 1 if librpbase RomFields support should be enabled. */ #define ENABLE_LIBRPBASE_ROMFIELDS 1 diff --git a/src/librptexture/decoder/ImageDecoder_common.hpp b/src/librptexture/decoder/ImageDecoder_common.hpp index 0a77fed2c..2ad67a3ce 100644 --- a/src/librptexture/decoder/ImageDecoder_common.hpp +++ b/src/librptexture/decoder/ImageDecoder_common.hpp @@ -26,15 +26,19 @@ # include "librpcpuid/cpuflags_x86.h" # define IMAGEDECODER_HAS_SSE2 1 # define IMAGEDECODER_HAS_SSSE3 1 -#elif defined(RP_CPU_ARM) || defined(RP_CPU_ARM64) -# include "librpcpuid/cpuflags_arm.h" -# define IMAGEDECODER_HAS_NEON 1 +#elif defined(HAVE_ARM_NEON_H) +# if defined(RP_CPU_ARM) || defined(RP_CPU_ARM64) +# include "librpcpuid/cpuflags_arm.h" +# define IMAGEDECODER_HAS_NEON 1 +# endif #endif #ifdef RP_CPU_AMD64 # define IMAGEDECODER_ALWAYS_HAS_SSE2 1 #endif -#ifdef RP_CPU_ARM64 -# define IMAGEDECODER_ALWAYS_HAS_NEON 1 +#ifdef HAVE_ARM_NEON_H +# ifdef RP_CPU_ARM64 +# define IMAGEDECODER_ALWAYS_HAS_NEON 1 +# endif #endif namespace LibRpTexture {