git: bfd10d146ba4 - stable/13 - Switch to Arm Optimized Routines for mem* & str*

From: Andrew Turner <andrew_at_FreeBSD.org>
Date: Tue, 14 Dec 2021 11:07:27 UTC
The branch stable/13 has been updated by andrew:

URL: https://cgit.FreeBSD.org/src/commit/?id=bfd10d146ba4f8dc26e8b9bb9013a9316105f11a

commit bfd10d146ba4f8dc26e8b9bb9013a9316105f11a
Author:     Andrew Turner <andrew@FreeBSD.org>
AuthorDate: 2021-11-01 13:06:56 +0000
Commit:     Andrew Turner <andrew@FreeBSD.org>
CommitDate: 2021-12-14 10:58:01 +0000

    Switch to Arm Optimized Routines for mem* & str*
    
    These are the updated version of the older Cortex Strings Library we
    previously used. The Arm Optimized Routines also support CPU features
    that are currently in development on FreeBSD, e.g. Branch Target
    Identification (BTI). Rather than add BTI support to the old code it's
    easier to just use the maintained version.
    
    Sponsored by:   The FreeBSD Foundation
    Differential Revision: https://reviews.freebsd.org/D32774
    
    (cherry picked from commit 2e8ff4d1d5b9d32b29287efb414449121733544a)
---
 lib/libc/aarch64/string/Makefile.inc | 51 +++++++++++++++++++++++++-----------
 lib/libc/aarch64/string/memcpy.S     |  6 +++++
 lib/libc/aarch64/string/memmove.S    |  5 ++++
 lib/libc/aarch64/string/strchr.S     |  5 ++++
 lib/libc/aarch64/string/strrchr.S    |  5 ++++
 5 files changed, 57 insertions(+), 15 deletions(-)

diff --git a/lib/libc/aarch64/string/Makefile.inc b/lib/libc/aarch64/string/Makefile.inc
index 5ce355f8b0c1..0e1f0f4b84e2 100644
--- a/lib/libc/aarch64/string/Makefile.inc
+++ b/lib/libc/aarch64/string/Makefile.inc
@@ -1,20 +1,41 @@
 # $FreeBSD$
 #
-# String handling from the Cortex Strings library
-# https://git.linaro.org/toolchain/cortex-strings.git
+# String handling from the Arm Optimized Routines
+# https://github.com/ARM-software/optimized-routines
 #
 
-.PATH: ${SRCTOP}/contrib/cortex-strings/src/aarch64
+AARCH64_STRING_FUNCS= \
+	memchr \
+	memcmp \
+	memcpy \
+	memmove \
+	memrchr \
+	memset \
+	stpcpy \
+	strchr \
+	strchrnul \
+	strcmp \
+	strcpy \
+	strlen \
+	strncmp \
+	strnlen \
+	strrchr
 
-MDSRCS+= \
-	memchr.S \
-	memcmp.S \
-	memcpy.S \
-	memmove.S \
-	memset.S \
-	strchr.S \
-	strcmp.S \
-	strcpy.S \
-	strlen.S \
-	strncmp.S \
-	strnlen.S
+#
+# Add the above functions. Generate an asm file that includes the needed
+# Arm Optimized Routines file defining the function name to the libc name.
+# Some file need multiple macros defined or a weak symbol added we can
+# override the generated file in these cases.
+#
+.for FUNC in ${AARCH64_STRING_FUNCS}
+.if !exists(${FUNC}.S)
+${FUNC}.S:
+	printf '/* %sgenerated by libc/aarch64/string/Makefile.inc */\n' @ > ${.TARGET}
+	printf '#define	__%s_aarch64 %s\n' ${FUNC} ${FUNC} >> ${.TARGET}
+	printf '#include "aarch64/%s.S"\n' ${FUNC} >> ${.TARGET}
+CLEANFILES+=	${FUNC}.S
+.endif
+
+MDSRCS+=	${FUNC}.S
+CFLAGS.${FUNC}.S+=-I${SRCTOP}/contrib/arm-optimized-routines/string
+.endfor
diff --git a/lib/libc/aarch64/string/memcpy.S b/lib/libc/aarch64/string/memcpy.S
new file mode 100644
index 000000000000..ac4fbe8d6175
--- /dev/null
+++ b/lib/libc/aarch64/string/memcpy.S
@@ -0,0 +1,6 @@
+#define	__memcpy_aarch64	memcpy
+#define	__memmove_aarch64	memmove
+#include "aarch64/memcpy.S"
+
+.weak index
+.equ index, strchr
diff --git a/lib/libc/aarch64/string/memmove.S b/lib/libc/aarch64/string/memmove.S
new file mode 100644
index 000000000000..e2f99790e0da
--- /dev/null
+++ b/lib/libc/aarch64/string/memmove.S
@@ -0,0 +1,5 @@
+/*
+ * memmove is implemented in memcpy.S. Having this file simplifies the build
+ * as it stops MISRCS from picking up the C implementation and rtld expects
+ * to copy the memmove object file into its object directory.
+ */
diff --git a/lib/libc/aarch64/string/strchr.S b/lib/libc/aarch64/string/strchr.S
new file mode 100644
index 000000000000..e241b35004bb
--- /dev/null
+++ b/lib/libc/aarch64/string/strchr.S
@@ -0,0 +1,5 @@
+#define	__strchr_aarch64	strchr
+#include "aarch64/strchr.S"
+
+.weak index
+.equ index, strchr
diff --git a/lib/libc/aarch64/string/strrchr.S b/lib/libc/aarch64/string/strrchr.S
new file mode 100644
index 000000000000..46e966e3188a
--- /dev/null
+++ b/lib/libc/aarch64/string/strrchr.S
@@ -0,0 +1,5 @@
+#define	__strrchr_aarch64	strrchr
+#include "aarch64/strrchr.S"
+
+.weak rindex
+.equ rindex, strrchr