From 3797b44289c881679d3be3bcea53a41a903803cf Mon Sep 17 00:00:00 2001 From: Natalia Portillo Date: Wed, 13 Oct 2021 02:54:21 +0100 Subject: [PATCH] Add detection of ARM capabilities under Darwin. --- simd.c | 42 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git a/simd.c b/simd.c index 7387489..400337a 100644 --- a/simd.c +++ b/simd.c @@ -95,11 +95,43 @@ int have_avx2(void) #if defined(_WIN32) #include #include +#elif defined(__APPLE__) +#include #else #include #endif #endif +#if (defined(__aarch64__) || defined(_M_ARM64) || defined(__arm__) || defined(_M_ARM)) && defined(__APPLE__) +int have_neon_apple() +{ + int value; + size_t len = sizeof(int); + int ret= + sysctlbyname("hw.optional.neon", &value, &len, NULL, 0); + + if(ret != 0) + return 0; + + return value == 1; +} + +int have_crc32_apple() +{ + int value; + size_t len = sizeof(int); + int ret= + sysctlbyname("hw.optional.crc32", &value, &len, NULL, 0); + + if(ret != 0) + return 0; + + return value == 1; +} + +int have_crypto_apple() { return 0; } +#endif + #if defined(__aarch64__) || defined(_M_ARM64) int have_neon(void) { @@ -110,6 +142,8 @@ int have_arm_crc32(void) { #if defined(_WIN32) return IsProcessorFeaturePresent(PF_ARM_V8_CRC32_INSTRUCTIONS_AVAILABLE) != 0; +#elif defined(__APPLE__) + return have_crc32_apple(); #else return getauxval(AT_HWCAP) & HWCAP_CRC32; #endif @@ -119,6 +153,8 @@ int have_arm_crypto(void) { #if defined(_WIN32) return IsProcessorFeaturePresent(PF_ARM_V8_CRYPTO_INSTRUCTIONS_AVAILABLE) != 0; +#elif defined(__APPLE__) + return have_crypto_apple(); #else return getauxval(AT_HWCAP) & HWCAP_AES; #endif @@ -130,6 +166,8 @@ int have_neon(void) { #if defined(_WIN32) return IsProcessorFeaturePresent(PF_ARM_VFP_32_REGISTERS_AVAILABLE) != 0; +#elif defined(__APPLE__) + return have_neon_apple(); #else return getauxval(AT_HWCAP) & HWCAP_NEON; #endif @@ -139,6 +177,8 @@ int have_arm_crc32(void) { #if defined(_WIN32) return IsProcessorFeaturePresent(PF_ARM_V8_CRC32_INSTRUCTIONS_AVAILABLE) != 0; +#elif defined(__APPLE__) + return have_crc32_apple(); #else return getauxval(AT_HWCAP2) & HWCAP2_CRC32; #endif @@ -148,6 +188,8 @@ int have_arm_crypto(void) { #if defined(_WIN32) return IsProcessorFeaturePresent(PF_ARM_V8_CRYPTO_INSTRUCTIONS_AVAILABLE) != 0; +#elif defined(__APPLE__) + return have_crypto_apple(); #else return getauxval(AT_HWCAP2) & HWCAP2_AES; #endif