From da25129943146cc5ac4bdf57e18a744d19a7a4f9 Mon Sep 17 00:00:00 2001
From: Nehal J Wani <nehaljw.kkd1@gmail.com>
Date: Sun, 24 Oct 2021 14:20:06 -0400
Subject: [PATCH 16/21] Check for ARMv8 crc32 intrinsic support on osx-arm64
 too

---
 configure.cmake       |  4 ++--
 include/my_checksum.h | 16 ++++++++++++----
 2 files changed, 14 insertions(+), 6 deletions(-)

diff --git a/configure.cmake b/configure.cmake
index c4d3dcca1ab..f1e807ce148 100644
--- a/configure.cmake
+++ b/configure.cmake
@@ -711,8 +711,8 @@ IF(HAVE_LIBNUMA AND NOT WITH_NUMA)
 ENDIF()
 
 # Check for intrinsic crc32 support on arm
-IF(LINUX)
-  IF (CMAKE_SYSTEM_PROCESSOR MATCHES "aarch64")
+IF(LINUX OR APPLE)
+  IF (CMAKE_SYSTEM_PROCESSOR MATCHES "(aarch64|arm64)")
     CHECK_INCLUDE_FILES(arm_acle.h HAVE_ACLE_H)
 
     IF (HAVE_ACLE_H)
diff --git a/include/my_checksum.h b/include/my_checksum.h
index a48f1fb4f46..524c3194c1b 100644
--- a/include/my_checksum.h
+++ b/include/my_checksum.h
@@ -41,31 +41,39 @@
 
 #ifdef HAVE_ARMV8_CRC32_INTRINSIC
 #include <arm_acle.h>   // __crc32x
+#ifndef APPLE_ARM
 #include <asm/hwcap.h>  // HWCAP_CRC32
 #include <sys/auxv.h>   // getauxval
+#endif
 #endif                  /* HAVE_ARMV8_CRC32_INTRINSIC */
 
 namespace mycrc32 {
 #ifdef HAVE_ARMV8_CRC32_INTRINSIC
+#ifdef APPLE_ARM
+#define MY_ATTRIBUTE_CRC
+const bool auxv_at_hwcap = true;
+#else
+#define MY_ATTRIBUTE_CRC MY_ATTRIBUTE((target("+crc")))
 const bool auxv_at_hwcap = (getauxval(AT_HWCAP) & HWCAP_CRC32);
+#endif  // APPLE_ARM
 
 // Some overloads for these since to allow us to work genericly
-MY_ATTRIBUTE((target("+crc")))
+MY_ATTRIBUTE_CRC
 inline std::uint32_t IntegerCrc32(std::uint32_t crc, std::uint8_t b) {
   return __crc32b(crc, b);
 }
 
-MY_ATTRIBUTE((target("+crc")))
+MY_ATTRIBUTE_CRC
 inline std::uint32_t IntegerCrc32(std::uint32_t crc, std::uint16_t h) {
   return __crc32h(crc, h);
 }
 
-MY_ATTRIBUTE((target("+crc")))
+MY_ATTRIBUTE_CRC
 inline std::uint32_t IntegerCrc32(std::uint32_t crc, std::uint32_t w) {
   return __crc32w(crc, w);
 }
 
-MY_ATTRIBUTE((target("+crc")))
+MY_ATTRIBUTE_CRC
 inline std::uint32_t IntegerCrc32(std::uint32_t crc, std::uint64_t d) {
   return __crc32d(crc, d);
 }
-- 
2.41.0

