From 907cbf8308dc21153098806050bc58845919ae76 Mon Sep 17 00:00:00 2001 From: Emmanuel Gil Peyrot Date: Wed, 4 Nov 2020 00:24:05 +0000 Subject: [PATCH] Improve ARM runtime feature detection on Linux MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit getauxval(AT_HWCAP) is the best way to check for features on ARM and AArch64, as it doesn’t require parsing a file, instead it just returns a value provided by the kernel in our address space. This commit should be synchronised with https://github.com/libretro/libretro-common/pull/176 --- .../libretro-common/features/features_cpu.c | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/desmume/src/libretro-common/features/features_cpu.c b/desmume/src/libretro-common/features/features_cpu.c index b6286cca7..0980821f9 100644 --- a/desmume/src/libretro-common/features/features_cpu.c +++ b/desmume/src/libretro-common/features/features_cpu.c @@ -311,8 +311,27 @@ static void arm_enable_runfast_mode(void) #endif #if defined(__linux__) && !defined(CPU_X86) +#if __ARM_ARCH +#include +#endif + static unsigned char check_arm_cpu_feature(const char* feature) { +#if __ARM_ARCH < 8 + uint64_t hwcap = getauxval(AT_HWCAP); + if (!strcmp(feature, "neon")) + return (hwcap & HWCAP_ARM_NEON) != 0; + if (!strcmp(feature, "vfpv3")) + return (hwcap & HWCAP_ARM_VFPv3) != 0; + if (!strcmp(feature, "vfpv4")) + return (hwcap & HWCAP_ARM_VFPv4) != 0; + return 0; +#elif __ARM_ARCH == 8 + uint64_t hwcap = getauxval(AT_HWCAP); + if (!strcmp(feature, "asimd")) + return (hwcap & HWCAP_ASIMD) != 0; + return 0; +#else char line[1024]; unsigned char status = 0; RFILE *fp = filestream_open("/proc/cpuinfo", RFILE_MODE_READ_TEXT, -1); @@ -334,6 +353,7 @@ static unsigned char check_arm_cpu_feature(const char* feature) filestream_close(fp); return status; +#endif } #if !defined(_SC_NPROCESSORS_ONLN)