Mon Jan 27 22:13:39 2020 UTC ()
bcmp() / memcmp(): compare in uintptr_t sized chunks when it's easy to.


(ad)
diff -r1.7 -r1.8 src/common/lib/libc/string/bcmp.c
diff -r1.5 -r1.6 src/common/lib/libc/string/memcmp.c

cvs diff -r1.7 -r1.8 src/common/lib/libc/string/bcmp.c (expand / switch to context diff)
--- src/common/lib/libc/string/bcmp.c 2012/03/09 15:41:16 1.7
+++ src/common/lib/libc/string/bcmp.c 2020/01/27 22:13:39 1.8
@@ -1,5 +1,34 @@
-/*	$NetBSD: bcmp.c,v 1.7 2012/03/09 15:41:16 christos Exp $	*/
+/*	$NetBSD: bcmp.c,v 1.8 2020/01/27 22:13:39 ad Exp $	*/
 
+/*-
+ * Copyright (c) 2020 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * This code is derived from software contributed to The NetBSD Foundation
+ * by Andrew Doran.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
 /*
  * Copyright (c) 1987, 1993
  *	The Regents of the University of California.  All rights reserved.
@@ -34,7 +63,7 @@
 #if 0
 static char sccsid[] = "@(#)bcmp.c	8.1 (Berkeley) 6/4/93";
 #else
-__RCSID("$NetBSD: bcmp.c,v 1.7 2012/03/09 15:41:16 christos Exp $");
+__RCSID("$NetBSD: bcmp.c,v 1.8 2020/01/27 22:13:39 ad Exp $");
 #endif
 #endif /* LIBC_SCCS and not lint */
 
@@ -45,6 +74,8 @@
 #include <lib/libsa/stand.h>
 #endif
 #else
+#include <sys/types.h>
+
 #include <assert.h>
 #include <string.h>
 #endif
@@ -53,18 +84,31 @@
  * bcmp -- vax cmpc3 instruction
  */
 int
-bcmp(const void *b1, const void *b2, size_t length)
+bcmp(const void *s1, const void *s2, size_t n)
 {
-	const char *p1 = b1, *p2 = b2;
+	const uintptr_t *b1, *b2;
+	const unsigned char *c1, *c2;
 
-	_DIAGASSERT(b1 != 0);
-	_DIAGASSERT(b2 != 0);
+	b1 = s1;
+	b2 = s2;
 
-	if (length == 0)
-		return(0);
-	do
-		if (*p1++ != *p2++)
-			break;
-	while (--length);
-	return length != 0;
+	if ((((uintptr_t)b1 | (uintptr_t)b2) & (sizeof(uintptr_t) - 1)) == 0) {
+		while (n >= sizeof(uintptr_t)) {
+			if (*b1++ != *b2++)
+				return 1;
+			n -= sizeof(uintptr_t);
+		}
+	}
+
+	c1 = (const unsigned char *)b1;
+	c2 = (const unsigned char *)b2;
+
+	if (n != 0) {
+		do {
+			if (*c1++ != *c2++)
+				return 1;
+		} while (--n != 0);
+	}
+
+	return 0;
 }

cvs diff -r1.5 -r1.6 src/common/lib/libc/string/memcmp.c (expand / switch to context diff)
--- src/common/lib/libc/string/memcmp.c 2018/02/04 20:22:17 1.5
+++ src/common/lib/libc/string/memcmp.c 2020/01/27 22:13:39 1.6
@@ -1,6 +1,35 @@
-/*	$NetBSD: memcmp.c,v 1.5 2018/02/04 20:22:17 mrg Exp $	*/
+/*	$NetBSD: memcmp.c,v 1.6 2020/01/27 22:13:39 ad Exp $	*/
 
 /*-
+ * Copyright (c) 2020 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * This code is derived from software contributed to The NetBSD Foundation
+ * by Andrew Doran.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*-
  * Copyright (c) 1990, 1993
  *	The Regents of the University of California.  All rights reserved.
  *
@@ -37,11 +66,13 @@
 #if 0
 static char sccsid[] = "@(#)memcmp.c	8.1 (Berkeley) 6/4/93";
 #else
-__RCSID("$NetBSD: memcmp.c,v 1.5 2018/02/04 20:22:17 mrg Exp $");
+__RCSID("$NetBSD: memcmp.c,v 1.6 2020/01/27 22:13:39 ad Exp $");
 #endif
 #endif /* LIBC_SCCS and not lint */
 
 #if !defined(_KERNEL) && !defined(_STANDALONE)
+#include <sys/types.h>
+
 #include <assert.h>
 #include <string.h>
 #else
@@ -55,16 +86,33 @@
 int
 memcmp(const void *s1, const void *s2, size_t n)
 {
+	const uintptr_t *b1, *b2;
+	const unsigned char *c1, *c2;
 
-	if (n != 0) {
-		const unsigned char *p1 = s1, *p2 = s2;
+	b1 = s1;
+	b2 = s2;
 
+	if ((((uintptr_t)b1 | (uintptr_t)b2) & (sizeof(uintptr_t) - 1)) == 0) {
+		while (n >= sizeof(uintptr_t)) {
+			if (*b1 != *b2)
+				break;
+			b1++;
+			b2++;
+			n -= sizeof(uintptr_t);
+		}
+	}
+
+	c1 = (const unsigned char *)b1;
+	c2 = (const unsigned char *)b2;
+
+	if (n != 0) {
 		do {
-			if (*p1++ != *p2++)
-				return (*--p1 - *--p2);
+			if (*c1++ != *c2++)
+				return *--c1 - *--c2;
 		} while (--n != 0);
 	}
-	return (0);
+
+	return 0;
 }
 
 #if defined(__ARM_EABI__)