Module Name:    src
Committed By:   jakllsch
Date:           Wed Sep  9 14:49:27 UTC 2020

Modified Files:
        src/common/lib/libc/arch/aarch64/string: strlen.S

Log Message:
Re-do previous aarch64eb strlen fix more simply and correctly.


To generate a diff of this commit:
cvs rdiff -u -r1.4 -r1.5 src/common/lib/libc/arch/aarch64/string/strlen.S

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/common/lib/libc/arch/aarch64/string/strlen.S
diff -u src/common/lib/libc/arch/aarch64/string/strlen.S:1.4 src/common/lib/libc/arch/aarch64/string/strlen.S:1.5
--- src/common/lib/libc/arch/aarch64/string/strlen.S:1.4	Sat Sep  5 20:24:43 2020
+++ src/common/lib/libc/arch/aarch64/string/strlen.S	Wed Sep  9 14:49:27 2020
@@ -1,4 +1,4 @@
-/* $NetBSD: strlen.S,v 1.4 2020/09/05 20:24:43 jakllsch Exp $ */
+/* $NetBSD: strlen.S,v 1.5 2020/09/09 14:49:27 jakllsch Exp $ */
 
 /*-
  * Copyright (c) 2014 The NetBSD Foundation, Inc.
@@ -31,7 +31,7 @@
 
 #include <machine/asm.h>
 
-RCSID("$NetBSD: strlen.S,v 1.4 2020/09/05 20:24:43 jakllsch Exp $")
+RCSID("$NetBSD: strlen.S,v 1.5 2020/09/09 14:49:27 jakllsch Exp $")
 
 #ifdef STRNLEN
 #define FUNCNAME	strnlen
@@ -66,12 +66,11 @@ ENTRY(FUNCNAME)
 	 */
 	add	x4, x4, x0		/* make dword aligned */
 	ldr	x7, [x4], #8		/* load dword */
-	lsl	x3, x3, #3		/* convert bytes to bits */
 #ifdef __AARCH64EB__
-	lsr	x5, x11, x3		/* make mask for BE */
-#else
-	lsl	x5, x11, x3		/* make mask for LE */
+	rev	x7, x7			/* convert to LE */
 #endif
+	lsl	x3, x3, #3		/* convert bytes to bits */
+	lsl	x5, x11, x3		/* make mask for LE */
 	eor	x5, x5, x11		/* invert mask */
 	orr	x7, x7, x5		/* prevent NULs */
 	b	.Lstrlen_dword_loop_noload
@@ -82,6 +81,9 @@ ENTRY(FUNCNAME)
 	b.hs	.Lstrlen_done
 #endif
 	ldr	x7, [x4], #8		/* load dword */
+#ifdef __AARCH64EB__
+	rev	x7, x7			/* convert to LE */
+#endif
 .Lstrlen_dword_loop_noload:
 	/*
 	 * Use the formula (X - 1) & ~(X | 0x7f) to find NUL bytes.
@@ -96,14 +98,6 @@ ENTRY(FUNCNAME)
 	/*
 	 * We know there is a NUL in this dword.  Use clz to find it.
 	 */
-#ifdef __AARCH64EB__
-	/* avoid BE problem due to carry propagation if last non-NUL is \x01 */
-	ldr	x7, [x4, #-8]		/* reload dword */
-	rev	x7, x7			/* byte swap */
-	sub	x6, x7, x11		/* a = X - 1 */
-	orr	x7, x7, #MASK8_0x7f	/* b = X | 0x7f */
-	bic	x6, x6, x7		/* a & ~b */
-#endif
 	rev	x6, x6			/* convert to BE */
 	clz	x6, x6			/* find null byte */
 	add	x0, x0, x6, lsr #3	/* add offset to the length */

Reply via email to