summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/my_sys.h3
-rw-r--r--mysys/CMakeLists.txt3
-rw-r--r--mysys/crc32/crc32_arm64.c13
-rw-r--r--storage/innobase/ut/ut0crc32.cc6
4 files changed, 21 insertions, 4 deletions
diff --git a/include/my_sys.h b/include/my_sys.h
index 3acc1487f95..d2aaa5192a4 100644
--- a/include/my_sys.h
+++ b/include/my_sys.h
@@ -911,6 +911,9 @@ extern MYSQL_PLUGIN_IMPORT my_crc32_t my_checksum;
#if defined(__GNUC__) && defined(HAVE_ARMV8_CRC)
int crc32_aarch64_available(void);
+#if defined(HAVE_ARMV8_CRYPTO)
+int crc32c_aarch64_available(void);
+#endif
#endif
#ifdef DBUG_ASSERT_EXISTS
diff --git a/mysys/CMakeLists.txt b/mysys/CMakeLists.txt
index 3d8a20e4f9a..14a4ea9e9bb 100644
--- a/mysys/CMakeLists.txt
+++ b/mysys/CMakeLists.txt
@@ -90,7 +90,8 @@ ELSEIF(CMAKE_SYSTEM_PROCESSOR MATCHES "aarch64|AARCH64")
__asm__(\"pmull v2.1q, v2.1d, v1.1d\");
return ret;
}
- int main() { foo(0); }" HAVE_ARMV8_CRYPTO)
+ #include <sys/auxv.h>
+ int main() { foo(0); getauxval(AT_HWCAP); }" HAVE_ARMV8_CRYPTO)
CHECK_C_COMPILER_FLAG(-march=armv8-a+crc+crypto HAVE_ARMV8_CRC_CRYPTO_INTRINSICS)
IF(HAVE_ARMV8_CRC_CRYPTO_INTRINSICS)
diff --git a/mysys/crc32/crc32_arm64.c b/mysys/crc32/crc32_arm64.c
index 09ac7a12a66..aae6f769002 100644
--- a/mysys/crc32/crc32_arm64.c
+++ b/mysys/crc32/crc32_arm64.c
@@ -18,8 +18,21 @@ int crc32_aarch64_available(void)
unsigned long auxv= getauxval(AT_HWCAP);
return (auxv & HWCAP_CRC32) != 0;
}
+
+#if defined(HAVE_ARMV8_CRYPTO)
+
+#ifndef HWCAP_PMULL
+#define HWCAP_PMULL (1 << 4)
#endif
+/* Check if target ARM machine support crc32 + pmull for computing crc32c */
+int crc32c_aarch64_available(void)
+{
+ return !(~getauxval(AT_HWCAP) & (HWCAP_CRC32 | HWCAP_PMULL));
+}
+#endif /* HAVE_ARMV8_CRYPTO */
+#endif /* HAVE_ARMV8_CRC */
+
#ifndef HAVE_ARMV8_CRC_CRYPTO_INTRINSICS
/* Request crc extension capabilities from the assembler */
diff --git a/storage/innobase/ut/ut0crc32.cc b/storage/innobase/ut/ut0crc32.cc
index dabf92e875b..9de0ca81fe3 100644
--- a/storage/innobase/ut/ut0crc32.cc
+++ b/storage/innobase/ut/ut0crc32.cc
@@ -342,11 +342,11 @@ allocations, would not hurt if called twice, but would be pointless. */
void ut_crc32_init()
{
#ifndef HAVE_CRC32_VPMSUM
-# if defined(__GNUC__) && defined(HAVE_ARMV8_CRC)
- if (crc32_aarch64_available())
+# if defined(__GNUC__) && defined(HAVE_ARMV8_CRC) && defined(HAVE_ARMV8_CRYPTO)
+ if (crc32c_aarch64_available())
{
ut_crc32_low= crc32c_aarch64;
- ut_crc32_implementation= "Using ARMv8 crc32 instructions";
+ ut_crc32_implementation= "Using ARMv8 crc32 + pmull instructions";
return;
}
# elif defined(TRY_SSE4_2)