Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/common/lib/libc/string bcmp() / memcmp(): compare in uintptr...



details:   https://anonhg.NetBSD.org/src/rev/6a62d0acd17d
branches:  trunk
changeset: 744237:6a62d0acd17d
user:      ad <ad%NetBSD.org@localhost>
date:      Mon Jan 27 22:13:39 2020 +0000

description:
bcmp() / memcmp(): compare in uintptr_t sized chunks when it's easy to.

diffstat:

 common/lib/libc/string/bcmp.c   |  70 +++++++++++++++++++++++++++++++++-------
 common/lib/libc/string/memcmp.c |  62 ++++++++++++++++++++++++++++++++----
 2 files changed, 112 insertions(+), 20 deletions(-)

diffs (191 lines):

diff -r 162a0b0f8488 -r 6a62d0acd17d common/lib/libc/string/bcmp.c
--- a/common/lib/libc/string/bcmp.c     Mon Jan 27 22:09:21 2020 +0000
+++ b/common/lib/libc/string/bcmp.c     Mon Jan 27 22:13:39 2020 +0000
@@ -1,4 +1,33 @@
-/*     $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
@@ -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;
 }
diff -r 162a0b0f8488 -r 6a62d0acd17d common/lib/libc/string/memcmp.c
--- a/common/lib/libc/string/memcmp.c   Mon Jan 27 22:09:21 2020 +0000
+++ b/common/lib/libc/string/memcmp.c   Mon Jan 27 22:13:39 2020 +0000
@@ -1,4 +1,33 @@
-/*     $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
@@ -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;
+
+       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) {
-               const unsigned char *p1 = s1, *p2 = s2;
-
                do {
-                       if (*p1++ != *p2++)
-                               return (*--p1 - *--p2);
+                       if (*c1++ != *c2++)
+                               return *--c1 - *--c2;
                } while (--n != 0);
        }
-       return (0);
+
+       return 0;
 }
 
 #if defined(__ARM_EABI__)



Home | Main Index | Thread Index | Old Index