Switch to the arm-optimized-routines string routines on aarch64 where possible.
This includes optimized strrchr and strchrnul routines, and an MTE-compatible
strlen routine.
Bug: 135772972
Change-Id: I48499f757cdc6d3e77e5649123d45b17dfa3c6b0
diff --git a/libc/arch-arm64/dynamic_function_dispatch.cpp b/libc/arch-arm64/dynamic_function_dispatch.cpp
index 37abea4..5c6d4ed 100644
--- a/libc/arch-arm64/dynamic_function_dispatch.cpp
+++ b/libc/arch-arm64/dynamic_function_dispatch.cpp
@@ -47,16 +47,34 @@
if (supports_mte(arg->_hwcap2)) {
RETURN_FUNC(memchr_func, memchr_mte);
} else {
- RETURN_FUNC(memchr_func, memchr_default);
+ RETURN_FUNC(memchr_func, __memchr_aarch64);
+ }
+}
+
+typedef int stpcpy_func(char*, const char*);
+DEFINE_IFUNC_FOR(stpcpy) {
+ if (supports_mte(arg->_hwcap2)) {
+ RETURN_FUNC(stpcpy_func, stpcpy_mte);
+ } else {
+ RETURN_FUNC(stpcpy_func, __stpcpy_aarch64);
}
}
typedef char* strchr_func(const char*, int);
DEFINE_IFUNC_FOR(strchr) {
if (supports_mte(arg->_hwcap2)) {
- RETURN_FUNC(strchr_func, strchr_mte);
+ RETURN_FUNC(strchr_func, __strchr_aarch64_mte);
} else {
- RETURN_FUNC(strchr_func, strchr_default);
+ RETURN_FUNC(strchr_func, __strchr_aarch64);
+ }
+}
+
+typedef char* strchrnul_func(const char*, int);
+DEFINE_IFUNC_FOR(strchrnul) {
+ if (supports_mte(arg->_hwcap2)) {
+ RETURN_FUNC(strchrnul_func, strchrnul_mte);
+ } else {
+ RETURN_FUNC(strchrnul_func, __strchrnul_aarch64);
}
}
@@ -65,16 +83,25 @@
if (supports_mte(arg->_hwcap2)) {
RETURN_FUNC(strcmp_func, strcmp_mte);
} else {
- RETURN_FUNC(strcmp_func, strcmp_default);
+ RETURN_FUNC(strcmp_func, __strcmp_aarch64);
+ }
+}
+
+typedef int strcpy_func(char*, const char*);
+DEFINE_IFUNC_FOR(strcpy) {
+ if (supports_mte(arg->_hwcap2)) {
+ RETURN_FUNC(strcpy_func, strcpy_mte);
+ } else {
+ RETURN_FUNC(strcpy_func, __strcpy_aarch64);
}
}
typedef size_t strlen_func(const char*);
DEFINE_IFUNC_FOR(strlen) {
if (supports_mte(arg->_hwcap2)) {
- RETURN_FUNC(strlen_func, strlen_mte);
+ RETURN_FUNC(strlen_func, __strlen_aarch64_mte);
} else {
- RETURN_FUNC(strlen_func, strlen_default);
+ RETURN_FUNC(strlen_func, __strlen_aarch64);
}
}
@@ -83,7 +110,7 @@
if (supports_mte(arg->_hwcap2)) {
RETURN_FUNC(strncmp_func, strncmp_mte);
} else {
- RETURN_FUNC(strncmp_func, strncmp_default);
+ RETURN_FUNC(strncmp_func, __strncmp_aarch64);
}
}
@@ -92,7 +119,16 @@
if (supports_mte(arg->_hwcap2)) {
RETURN_FUNC(strnlen_func, strnlen_mte);
} else {
- RETURN_FUNC(strnlen_func, strnlen_default);
+ RETURN_FUNC(strnlen_func, __strnlen_aarch64);
+ }
+}
+
+typedef char* strrchr_func(const char*, int);
+DEFINE_IFUNC_FOR(strrchr) {
+ if (supports_mte(arg->_hwcap2)) {
+ RETURN_FUNC(strrchr_func, strrchr_mte);
+ } else {
+ RETURN_FUNC(strrchr_func, __strrchr_aarch64);
}
}