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