2016-01-04 16:05:18 +00:00
|
|
|
/* Copyright (C) 1999-2016 Free Software Foundation, Inc.
|
1999-05-17 17:25:32 +00:00
|
|
|
This file is part of the GNU C Library.
|
|
|
|
|
|
|
|
The GNU C Library is free software; you can redistribute it and/or
|
2001-07-06 04:58:11 +00:00
|
|
|
modify it under the terms of the GNU Lesser General Public
|
|
|
|
License as published by the Free Software Foundation; either
|
|
|
|
version 2.1 of the License, or (at your option) any later version.
|
1999-05-17 17:25:32 +00:00
|
|
|
|
|
|
|
The GNU C Library is distributed in the hope that it will be useful,
|
|
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
2001-07-06 04:58:11 +00:00
|
|
|
Lesser General Public License for more details.
|
1999-05-17 17:25:32 +00:00
|
|
|
|
2001-07-06 04:58:11 +00:00
|
|
|
You should have received a copy of the GNU Lesser General Public
|
2012-02-09 23:18:22 +00:00
|
|
|
License along with the GNU C Library; if not, see
|
|
|
|
<http://www.gnu.org/licenses/>. */
|
1999-05-17 17:25:32 +00:00
|
|
|
|
|
|
|
/* <bits/string.h> and <bits/string2.h> declare some extern inline
|
|
|
|
functions. These functions are declared additionally here if
|
|
|
|
inlining is not possible. */
|
|
|
|
|
1999-08-06 22:27:07 +00:00
|
|
|
#undef __USE_STRING_INLINES
|
1999-05-17 17:25:32 +00:00
|
|
|
#define __USE_STRING_INLINES
|
|
|
|
#define _FORCE_INLINES
|
|
|
|
#define __STRING_INLINE /* empty */
|
Update.
* sysdeps/i386/fpu/ftestexcept.c: Also check SSE status word.
* include/signal.h: Use libc_hidden_proto for sigaddset and sigdelset.
* signal/sigaddset.c: Add libc_hidden_def.
* signal/sigdelset.c: Likewise.
2003-04-29 Jakub Jelinek <jakub@redhat.com>
* sysdeps/i386/i486/string-inlines.c (__memcpy_g, __strchr_g): Move
to the end of the file.
* configure.in: Change __oline__ to $LINENO.
(HAVE_BUILTIN_REDIRECTION): New check.
* config.h.in (HAVE_BUILTIN_REDIRECTION): Add.
* include/libc-symbols.h (libc_hidden_builtin_proto,
libc_hidden_builtin_def, libc_hidden_builtin_weak,
libc_hidden_builtin_ver): Define.
* include/string.h (memchr, memcpy, memmove, memset, strcat, strchr,
strcmp, strcpy, strcspn, strlen, strncmp, strncpy, strpbrk, strrchr,
strspn, strstr): Add libc_hidden_builtin_proto.
* intl/plural.y: Include string.h.
* sysdeps/alpha/alphaev6/memchr.S (memchr): Add
libc_hidden_builtin_def.
* sysdeps/alpha/alphaev6/memcpy.S (memcpy): Likewise.
* sysdeps/alpha/alphaev6/memset.S (memset): Likewise.
* sysdeps/alpha/alphaev67/strcat.S (strcat): Likewise.
* sysdeps/alpha/alphaev67/strchr.S (strchr): Likewise.
* sysdeps/alpha/alphaev67/strlen.S (strlen): Likewise.
* sysdeps/alpha/alphaev67/strrchr.S (strrchr): Likewise.
* sysdeps/alpha/memchr.S (memchr): Likewise.
* sysdeps/alpha/memset.S (memset): Likewise.
* sysdeps/alpha/strcat.S (strcat): Likewise.
* sysdeps/alpha/strchr.S (strchr): Likewise.
* sysdeps/alpha/strcmp.S (strcmp): Likewise.
* sysdeps/alpha/strcpy.S (strcpy): Likewise.
* sysdeps/alpha/strlen.S (strlen): Likewise.
* sysdeps/alpha/strncmp.S (strncmp): Likewise.
* sysdeps/alpha/strncpy.S (strncpy): Likewise.
* sysdeps/alpha/strrchr.S (strrchr): Likewise.
* sysdeps/arm/memset.S (memset): Likewise.
* sysdeps/arm/strlen.S (strlen): Likewise.
* sysdeps/generic/memchr.c (memchr): Likewise.
* sysdeps/generic/memcpy.c (memcpy): Likewise.
* sysdeps/generic/memmove.c (memmove): Likewise.
* sysdeps/generic/memset.c (memset): Likewise.
* sysdeps/generic/strcat.c (strcat): Likewise.
* sysdeps/generic/strchr.c (strchr): Likewise.
* sysdeps/generic/strcmp.c (strcmp): Likewise.
* sysdeps/generic/strcpy.c (strcpy): Likewise.
* sysdeps/generic/strcspn.c (strcspn): Likewise.
* sysdeps/generic/strlen.c (strlen): Likewise.
* sysdeps/generic/strncmp.c (strncmp): Likewise.
* sysdeps/generic/strncpy.c (strncpy): Likewise.
* sysdeps/generic/strpbrk.c (strpbrk): Likewise.
* sysdeps/generic/strrchr.c (strrchr): Likewise.
* sysdeps/generic/strspn.c (strspn): Likewise.
* sysdeps/generic/strstr.c (strstr): Likewise.
* sysdeps/i386/i486/strcat.S (strcat): Likewise.
* sysdeps/i386/i486/strlen.S (strlen): Likewise.
* sysdeps/i386/i586/memcpy.S (memcpy): Likewise.
* sysdeps/i386/i586/memset.S (memset): Likewise.
* sysdeps/i386/i586/strchr.S (strchr): Likewise.
* sysdeps/i386/i586/strcpy.S (strcpy): Likewise.
* sysdeps/i386/i586/strlen.S (strlen): Likewise.
* sysdeps/i386/i686/memcpy.S (memcpy): Likewise.
* sysdeps/i386/i686/memmove.S (memmove): Likewise.
* sysdeps/i386/i686/memset.S (memset): Likewise.
* sysdeps/i386/i686/strcmp.S (strcmp): Likewise.
* sysdeps/i386/memchr.S (memchr): Likewise.
* sysdeps/i386/memset.c (memset): Likewise.
* sysdeps/i386/strchr.S (strchr): Likewise.
* sysdeps/i386/strcspn.S (strcspn): Likewise.
* sysdeps/i386/strlen.c (strlen): Likewise.
* sysdeps/i386/strpbrk.S (strpbrk): Likewise.
* sysdeps/i386/strrchr.S (strrchr): Likewise.
* sysdeps/i386/strspn.S (strspn): Likewise.
* sysdeps/ia64/memchr.S (memchr): Likewise.
* sysdeps/ia64/memcpy.S (memcpy): Likewise.
* sysdeps/ia64/memmove.S (memmove): Likewise.
* sysdeps/ia64/memset.S (memset): Likewise.
* sysdeps/ia64/strcat.S (strcat): Likewise.
* sysdeps/ia64/strchr.S (strchr): Likewise.
* sysdeps/ia64/strcmp.S (strcmp): Likewise.
* sysdeps/ia64/strcpy.S (strcpy): Likewise.
* sysdeps/ia64/strlen.S (strlen): Likewise.
* sysdeps/ia64/strncmp.S (strncmp): Likewise.
* sysdeps/ia64/strncpy.S (strncpy): Likewise.
* sysdeps/m68k/memchr.S (memchr): Likewise.
* sysdeps/m68k/strchr.S (strchr): Likewise.
* sysdeps/mips/mips64/memcpy.S (memcpy): Likewise.
* sysdeps/mips/mips64/memset.S (memset): Likewise.
* sysdeps/mips/memcpy.S (memcpy): Likewise.
* sysdeps/mips/memset.S (memset): Likewise.
* sysdeps/powerpc/powerpc32/memset.S (memset): Likewise.
* sysdeps/powerpc/powerpc32/strchr.S (strchr): Likewise.
* sysdeps/powerpc/powerpc32/strcmp.S (strcmp): Likewise.
* sysdeps/powerpc/powerpc32/strcpy.S (strcpy): Likewise.
* sysdeps/powerpc/powerpc32/strlen.S (strlen): Likewise.
* sysdeps/powerpc/powerpc64/memcpy.S (memcpy): Likewise.
* sysdeps/powerpc/powerpc64/memset.S (memset): Likewise.
* sysdeps/powerpc/powerpc64/strchr.S (strchr): Likewise.
* sysdeps/powerpc/powerpc64/strcmp.S (strcmp): Likewise.
* sysdeps/powerpc/powerpc64/strcpy.S (strcpy): Likewise.
* sysdeps/powerpc/powerpc64/strlen.S (strlen): Likewise.
* sysdeps/powerpc/strcat.c (strcat): Likewise.
* sysdeps/sparc/sparc32/memchr.S (memchr): Likewise.
* sysdeps/sparc/sparc32/memcpy.S (memcpy): Likewise.
* sysdeps/sparc/sparc32/memset.S (memset): Likewise.
* sysdeps/sparc/sparc32/strcat.S (strcat): Likewise.
* sysdeps/sparc/sparc32/strchr.S (strchr, strrchr): Likewise.
* sysdeps/sparc/sparc32/strcmp.S (strcmp): Likewise.
* sysdeps/sparc/sparc32/strcpy.S (strcpy): Likewise.
* sysdeps/sparc/sparc32/strlen.S (strlen): Likewise.
* sysdeps/sparc/sparc64/sparcv9b/memcpy.S (memcpy, memmove): Likewise.
* sysdeps/sparc/sparc64/memchr.S (memchr): Likewise.
* sysdeps/sparc/sparc64/memcpy.S (memcpy, memmove): Likewise.
* sysdeps/sparc/sparc64/memset.S (memset): Likewise.
* sysdeps/sparc/sparc64/strcat.S (strcat): Likewise.
* sysdeps/sparc/sparc64/strchr.S (strchr, strrchr): Likewise.
* sysdeps/sparc/sparc64/strcmp.S (strcmp): Likewise.
* sysdeps/sparc/sparc64/strcpy.S (strcpy): Likewise.
* sysdeps/sparc/sparc64/strcspn.S (strcspn): Likewise.
* sysdeps/sparc/sparc64/strlen.S (strlen): Likewise.
* sysdeps/sparc/sparc64/strncmp.S (strncmp): Likewise.
* sysdeps/sparc/sparc64/strncpy.S (strncpy): Likewise.
* sysdeps/sparc/sparc64/strpbrk.S (strpbrk): Likewise.
* sysdeps/sparc/sparc64/strspn.S (strspn): Likewise.
* sysdeps/sh/memcpy.S (memcpy): Likewise.
* sysdeps/sh/memset.S (memset): Likewise.
* sysdeps/sh/strlen.S (strlen): Likewise.
* sysdeps/s390/s390-32/memchr.S (memchr): Likewise.
* sysdeps/s390/s390-32/memcpy.S (memcpy): Likewise.
* sysdeps/s390/s390-32/memset.S (memset): Likewise.
* sysdeps/s390/s390-32/strcmp.S (strcmp): Likewise.
* sysdeps/s390/s390-32/strcpy.S (strcpy): Likewise.
* sysdeps/s390/s390-32/strncpy.S (strncpy): Likewise.
* sysdeps/s390/s390-64/memchr.S (memchr): Likewise.
* sysdeps/s390/s390-64/memcpy.S (memcpy): Likewise.
* sysdeps/s390/s390-64/memset.S (memset): Likewise.
* sysdeps/s390/s390-64/strcmp.S (strcmp): Likewise.
* sysdeps/s390/s390-64/strcpy.S (strcpy): Likewise.
* sysdeps/s390/s390-64/strncpy.S (strncpy): Likewise.
* sysdeps/x86_64/memcpy.S (memcpy): Likewise.
* sysdeps/x86_64/memset.S (memset): Likewise.
* sysdeps/x86_64/strcat.S (strcat): Likewise.
* sysdeps/x86_64/strchr.S (strchr): Likewise.
* sysdeps/x86_64/strcmp.S (strcmp): Likewise.
* sysdeps/x86_64/strcpy.S (strcpy): Likewise.
* sysdeps/x86_64/strcspn.S (strcspn): Likewise.
* sysdeps/x86_64/strlen.S (strlen): Likewise.
* sysdeps/x86_64/strspn.S (strspn): Likewise.
* string/string-inlines.c: Move...
* sysdeps/generic/string-inlines.c: ...here.
(__memcpy_g, __strchr_g): Remove.
(__NO_INLINE__): Define before including <string.h>,
undefine after. Include bits/string.h and bits/string2.h.
* sysdeps/i386/i486/string-inlines.c: New file.
* sysdeps/i386/string-inlines.c: New file.
* sysdeps/i386/i486/Versions: Remove.
All GLIBC_2.1.1 symbols moved...
* sysdeps/i386/Versions (libc): ...here.
2003-04-29 Ulrich Drepper <drepper@redhat.com>
2003-04-29 22:49:58 +00:00
|
|
|
#define __NO_INLINE__
|
2002-12-31 23:13:55 +00:00
|
|
|
|
1999-05-17 17:25:32 +00:00
|
|
|
#include <string.h>
|
Update.
* sysdeps/i386/fpu/ftestexcept.c: Also check SSE status word.
* include/signal.h: Use libc_hidden_proto for sigaddset and sigdelset.
* signal/sigaddset.c: Add libc_hidden_def.
* signal/sigdelset.c: Likewise.
2003-04-29 Jakub Jelinek <jakub@redhat.com>
* sysdeps/i386/i486/string-inlines.c (__memcpy_g, __strchr_g): Move
to the end of the file.
* configure.in: Change __oline__ to $LINENO.
(HAVE_BUILTIN_REDIRECTION): New check.
* config.h.in (HAVE_BUILTIN_REDIRECTION): Add.
* include/libc-symbols.h (libc_hidden_builtin_proto,
libc_hidden_builtin_def, libc_hidden_builtin_weak,
libc_hidden_builtin_ver): Define.
* include/string.h (memchr, memcpy, memmove, memset, strcat, strchr,
strcmp, strcpy, strcspn, strlen, strncmp, strncpy, strpbrk, strrchr,
strspn, strstr): Add libc_hidden_builtin_proto.
* intl/plural.y: Include string.h.
* sysdeps/alpha/alphaev6/memchr.S (memchr): Add
libc_hidden_builtin_def.
* sysdeps/alpha/alphaev6/memcpy.S (memcpy): Likewise.
* sysdeps/alpha/alphaev6/memset.S (memset): Likewise.
* sysdeps/alpha/alphaev67/strcat.S (strcat): Likewise.
* sysdeps/alpha/alphaev67/strchr.S (strchr): Likewise.
* sysdeps/alpha/alphaev67/strlen.S (strlen): Likewise.
* sysdeps/alpha/alphaev67/strrchr.S (strrchr): Likewise.
* sysdeps/alpha/memchr.S (memchr): Likewise.
* sysdeps/alpha/memset.S (memset): Likewise.
* sysdeps/alpha/strcat.S (strcat): Likewise.
* sysdeps/alpha/strchr.S (strchr): Likewise.
* sysdeps/alpha/strcmp.S (strcmp): Likewise.
* sysdeps/alpha/strcpy.S (strcpy): Likewise.
* sysdeps/alpha/strlen.S (strlen): Likewise.
* sysdeps/alpha/strncmp.S (strncmp): Likewise.
* sysdeps/alpha/strncpy.S (strncpy): Likewise.
* sysdeps/alpha/strrchr.S (strrchr): Likewise.
* sysdeps/arm/memset.S (memset): Likewise.
* sysdeps/arm/strlen.S (strlen): Likewise.
* sysdeps/generic/memchr.c (memchr): Likewise.
* sysdeps/generic/memcpy.c (memcpy): Likewise.
* sysdeps/generic/memmove.c (memmove): Likewise.
* sysdeps/generic/memset.c (memset): Likewise.
* sysdeps/generic/strcat.c (strcat): Likewise.
* sysdeps/generic/strchr.c (strchr): Likewise.
* sysdeps/generic/strcmp.c (strcmp): Likewise.
* sysdeps/generic/strcpy.c (strcpy): Likewise.
* sysdeps/generic/strcspn.c (strcspn): Likewise.
* sysdeps/generic/strlen.c (strlen): Likewise.
* sysdeps/generic/strncmp.c (strncmp): Likewise.
* sysdeps/generic/strncpy.c (strncpy): Likewise.
* sysdeps/generic/strpbrk.c (strpbrk): Likewise.
* sysdeps/generic/strrchr.c (strrchr): Likewise.
* sysdeps/generic/strspn.c (strspn): Likewise.
* sysdeps/generic/strstr.c (strstr): Likewise.
* sysdeps/i386/i486/strcat.S (strcat): Likewise.
* sysdeps/i386/i486/strlen.S (strlen): Likewise.
* sysdeps/i386/i586/memcpy.S (memcpy): Likewise.
* sysdeps/i386/i586/memset.S (memset): Likewise.
* sysdeps/i386/i586/strchr.S (strchr): Likewise.
* sysdeps/i386/i586/strcpy.S (strcpy): Likewise.
* sysdeps/i386/i586/strlen.S (strlen): Likewise.
* sysdeps/i386/i686/memcpy.S (memcpy): Likewise.
* sysdeps/i386/i686/memmove.S (memmove): Likewise.
* sysdeps/i386/i686/memset.S (memset): Likewise.
* sysdeps/i386/i686/strcmp.S (strcmp): Likewise.
* sysdeps/i386/memchr.S (memchr): Likewise.
* sysdeps/i386/memset.c (memset): Likewise.
* sysdeps/i386/strchr.S (strchr): Likewise.
* sysdeps/i386/strcspn.S (strcspn): Likewise.
* sysdeps/i386/strlen.c (strlen): Likewise.
* sysdeps/i386/strpbrk.S (strpbrk): Likewise.
* sysdeps/i386/strrchr.S (strrchr): Likewise.
* sysdeps/i386/strspn.S (strspn): Likewise.
* sysdeps/ia64/memchr.S (memchr): Likewise.
* sysdeps/ia64/memcpy.S (memcpy): Likewise.
* sysdeps/ia64/memmove.S (memmove): Likewise.
* sysdeps/ia64/memset.S (memset): Likewise.
* sysdeps/ia64/strcat.S (strcat): Likewise.
* sysdeps/ia64/strchr.S (strchr): Likewise.
* sysdeps/ia64/strcmp.S (strcmp): Likewise.
* sysdeps/ia64/strcpy.S (strcpy): Likewise.
* sysdeps/ia64/strlen.S (strlen): Likewise.
* sysdeps/ia64/strncmp.S (strncmp): Likewise.
* sysdeps/ia64/strncpy.S (strncpy): Likewise.
* sysdeps/m68k/memchr.S (memchr): Likewise.
* sysdeps/m68k/strchr.S (strchr): Likewise.
* sysdeps/mips/mips64/memcpy.S (memcpy): Likewise.
* sysdeps/mips/mips64/memset.S (memset): Likewise.
* sysdeps/mips/memcpy.S (memcpy): Likewise.
* sysdeps/mips/memset.S (memset): Likewise.
* sysdeps/powerpc/powerpc32/memset.S (memset): Likewise.
* sysdeps/powerpc/powerpc32/strchr.S (strchr): Likewise.
* sysdeps/powerpc/powerpc32/strcmp.S (strcmp): Likewise.
* sysdeps/powerpc/powerpc32/strcpy.S (strcpy): Likewise.
* sysdeps/powerpc/powerpc32/strlen.S (strlen): Likewise.
* sysdeps/powerpc/powerpc64/memcpy.S (memcpy): Likewise.
* sysdeps/powerpc/powerpc64/memset.S (memset): Likewise.
* sysdeps/powerpc/powerpc64/strchr.S (strchr): Likewise.
* sysdeps/powerpc/powerpc64/strcmp.S (strcmp): Likewise.
* sysdeps/powerpc/powerpc64/strcpy.S (strcpy): Likewise.
* sysdeps/powerpc/powerpc64/strlen.S (strlen): Likewise.
* sysdeps/powerpc/strcat.c (strcat): Likewise.
* sysdeps/sparc/sparc32/memchr.S (memchr): Likewise.
* sysdeps/sparc/sparc32/memcpy.S (memcpy): Likewise.
* sysdeps/sparc/sparc32/memset.S (memset): Likewise.
* sysdeps/sparc/sparc32/strcat.S (strcat): Likewise.
* sysdeps/sparc/sparc32/strchr.S (strchr, strrchr): Likewise.
* sysdeps/sparc/sparc32/strcmp.S (strcmp): Likewise.
* sysdeps/sparc/sparc32/strcpy.S (strcpy): Likewise.
* sysdeps/sparc/sparc32/strlen.S (strlen): Likewise.
* sysdeps/sparc/sparc64/sparcv9b/memcpy.S (memcpy, memmove): Likewise.
* sysdeps/sparc/sparc64/memchr.S (memchr): Likewise.
* sysdeps/sparc/sparc64/memcpy.S (memcpy, memmove): Likewise.
* sysdeps/sparc/sparc64/memset.S (memset): Likewise.
* sysdeps/sparc/sparc64/strcat.S (strcat): Likewise.
* sysdeps/sparc/sparc64/strchr.S (strchr, strrchr): Likewise.
* sysdeps/sparc/sparc64/strcmp.S (strcmp): Likewise.
* sysdeps/sparc/sparc64/strcpy.S (strcpy): Likewise.
* sysdeps/sparc/sparc64/strcspn.S (strcspn): Likewise.
* sysdeps/sparc/sparc64/strlen.S (strlen): Likewise.
* sysdeps/sparc/sparc64/strncmp.S (strncmp): Likewise.
* sysdeps/sparc/sparc64/strncpy.S (strncpy): Likewise.
* sysdeps/sparc/sparc64/strpbrk.S (strpbrk): Likewise.
* sysdeps/sparc/sparc64/strspn.S (strspn): Likewise.
* sysdeps/sh/memcpy.S (memcpy): Likewise.
* sysdeps/sh/memset.S (memset): Likewise.
* sysdeps/sh/strlen.S (strlen): Likewise.
* sysdeps/s390/s390-32/memchr.S (memchr): Likewise.
* sysdeps/s390/s390-32/memcpy.S (memcpy): Likewise.
* sysdeps/s390/s390-32/memset.S (memset): Likewise.
* sysdeps/s390/s390-32/strcmp.S (strcmp): Likewise.
* sysdeps/s390/s390-32/strcpy.S (strcpy): Likewise.
* sysdeps/s390/s390-32/strncpy.S (strncpy): Likewise.
* sysdeps/s390/s390-64/memchr.S (memchr): Likewise.
* sysdeps/s390/s390-64/memcpy.S (memcpy): Likewise.
* sysdeps/s390/s390-64/memset.S (memset): Likewise.
* sysdeps/s390/s390-64/strcmp.S (strcmp): Likewise.
* sysdeps/s390/s390-64/strcpy.S (strcpy): Likewise.
* sysdeps/s390/s390-64/strncpy.S (strncpy): Likewise.
* sysdeps/x86_64/memcpy.S (memcpy): Likewise.
* sysdeps/x86_64/memset.S (memset): Likewise.
* sysdeps/x86_64/strcat.S (strcat): Likewise.
* sysdeps/x86_64/strchr.S (strchr): Likewise.
* sysdeps/x86_64/strcmp.S (strcmp): Likewise.
* sysdeps/x86_64/strcpy.S (strcpy): Likewise.
* sysdeps/x86_64/strcspn.S (strcspn): Likewise.
* sysdeps/x86_64/strlen.S (strlen): Likewise.
* sysdeps/x86_64/strspn.S (strspn): Likewise.
* string/string-inlines.c: Move...
* sysdeps/generic/string-inlines.c: ...here.
(__memcpy_g, __strchr_g): Remove.
(__NO_INLINE__): Define before including <string.h>,
undefine after. Include bits/string.h and bits/string2.h.
* sysdeps/i386/i486/string-inlines.c: New file.
* sysdeps/i386/string-inlines.c: New file.
* sysdeps/i386/i486/Versions: Remove.
All GLIBC_2.1.1 symbols moved...
* sysdeps/i386/Versions (libc): ...here.
2003-04-29 Ulrich Drepper <drepper@redhat.com>
2003-04-29 22:49:58 +00:00
|
|
|
#undef index
|
|
|
|
#undef rindex
|
2002-12-31 23:13:55 +00:00
|
|
|
|
Update.
* sysdeps/i386/fpu/ftestexcept.c: Also check SSE status word.
* include/signal.h: Use libc_hidden_proto for sigaddset and sigdelset.
* signal/sigaddset.c: Add libc_hidden_def.
* signal/sigdelset.c: Likewise.
2003-04-29 Jakub Jelinek <jakub@redhat.com>
* sysdeps/i386/i486/string-inlines.c (__memcpy_g, __strchr_g): Move
to the end of the file.
* configure.in: Change __oline__ to $LINENO.
(HAVE_BUILTIN_REDIRECTION): New check.
* config.h.in (HAVE_BUILTIN_REDIRECTION): Add.
* include/libc-symbols.h (libc_hidden_builtin_proto,
libc_hidden_builtin_def, libc_hidden_builtin_weak,
libc_hidden_builtin_ver): Define.
* include/string.h (memchr, memcpy, memmove, memset, strcat, strchr,
strcmp, strcpy, strcspn, strlen, strncmp, strncpy, strpbrk, strrchr,
strspn, strstr): Add libc_hidden_builtin_proto.
* intl/plural.y: Include string.h.
* sysdeps/alpha/alphaev6/memchr.S (memchr): Add
libc_hidden_builtin_def.
* sysdeps/alpha/alphaev6/memcpy.S (memcpy): Likewise.
* sysdeps/alpha/alphaev6/memset.S (memset): Likewise.
* sysdeps/alpha/alphaev67/strcat.S (strcat): Likewise.
* sysdeps/alpha/alphaev67/strchr.S (strchr): Likewise.
* sysdeps/alpha/alphaev67/strlen.S (strlen): Likewise.
* sysdeps/alpha/alphaev67/strrchr.S (strrchr): Likewise.
* sysdeps/alpha/memchr.S (memchr): Likewise.
* sysdeps/alpha/memset.S (memset): Likewise.
* sysdeps/alpha/strcat.S (strcat): Likewise.
* sysdeps/alpha/strchr.S (strchr): Likewise.
* sysdeps/alpha/strcmp.S (strcmp): Likewise.
* sysdeps/alpha/strcpy.S (strcpy): Likewise.
* sysdeps/alpha/strlen.S (strlen): Likewise.
* sysdeps/alpha/strncmp.S (strncmp): Likewise.
* sysdeps/alpha/strncpy.S (strncpy): Likewise.
* sysdeps/alpha/strrchr.S (strrchr): Likewise.
* sysdeps/arm/memset.S (memset): Likewise.
* sysdeps/arm/strlen.S (strlen): Likewise.
* sysdeps/generic/memchr.c (memchr): Likewise.
* sysdeps/generic/memcpy.c (memcpy): Likewise.
* sysdeps/generic/memmove.c (memmove): Likewise.
* sysdeps/generic/memset.c (memset): Likewise.
* sysdeps/generic/strcat.c (strcat): Likewise.
* sysdeps/generic/strchr.c (strchr): Likewise.
* sysdeps/generic/strcmp.c (strcmp): Likewise.
* sysdeps/generic/strcpy.c (strcpy): Likewise.
* sysdeps/generic/strcspn.c (strcspn): Likewise.
* sysdeps/generic/strlen.c (strlen): Likewise.
* sysdeps/generic/strncmp.c (strncmp): Likewise.
* sysdeps/generic/strncpy.c (strncpy): Likewise.
* sysdeps/generic/strpbrk.c (strpbrk): Likewise.
* sysdeps/generic/strrchr.c (strrchr): Likewise.
* sysdeps/generic/strspn.c (strspn): Likewise.
* sysdeps/generic/strstr.c (strstr): Likewise.
* sysdeps/i386/i486/strcat.S (strcat): Likewise.
* sysdeps/i386/i486/strlen.S (strlen): Likewise.
* sysdeps/i386/i586/memcpy.S (memcpy): Likewise.
* sysdeps/i386/i586/memset.S (memset): Likewise.
* sysdeps/i386/i586/strchr.S (strchr): Likewise.
* sysdeps/i386/i586/strcpy.S (strcpy): Likewise.
* sysdeps/i386/i586/strlen.S (strlen): Likewise.
* sysdeps/i386/i686/memcpy.S (memcpy): Likewise.
* sysdeps/i386/i686/memmove.S (memmove): Likewise.
* sysdeps/i386/i686/memset.S (memset): Likewise.
* sysdeps/i386/i686/strcmp.S (strcmp): Likewise.
* sysdeps/i386/memchr.S (memchr): Likewise.
* sysdeps/i386/memset.c (memset): Likewise.
* sysdeps/i386/strchr.S (strchr): Likewise.
* sysdeps/i386/strcspn.S (strcspn): Likewise.
* sysdeps/i386/strlen.c (strlen): Likewise.
* sysdeps/i386/strpbrk.S (strpbrk): Likewise.
* sysdeps/i386/strrchr.S (strrchr): Likewise.
* sysdeps/i386/strspn.S (strspn): Likewise.
* sysdeps/ia64/memchr.S (memchr): Likewise.
* sysdeps/ia64/memcpy.S (memcpy): Likewise.
* sysdeps/ia64/memmove.S (memmove): Likewise.
* sysdeps/ia64/memset.S (memset): Likewise.
* sysdeps/ia64/strcat.S (strcat): Likewise.
* sysdeps/ia64/strchr.S (strchr): Likewise.
* sysdeps/ia64/strcmp.S (strcmp): Likewise.
* sysdeps/ia64/strcpy.S (strcpy): Likewise.
* sysdeps/ia64/strlen.S (strlen): Likewise.
* sysdeps/ia64/strncmp.S (strncmp): Likewise.
* sysdeps/ia64/strncpy.S (strncpy): Likewise.
* sysdeps/m68k/memchr.S (memchr): Likewise.
* sysdeps/m68k/strchr.S (strchr): Likewise.
* sysdeps/mips/mips64/memcpy.S (memcpy): Likewise.
* sysdeps/mips/mips64/memset.S (memset): Likewise.
* sysdeps/mips/memcpy.S (memcpy): Likewise.
* sysdeps/mips/memset.S (memset): Likewise.
* sysdeps/powerpc/powerpc32/memset.S (memset): Likewise.
* sysdeps/powerpc/powerpc32/strchr.S (strchr): Likewise.
* sysdeps/powerpc/powerpc32/strcmp.S (strcmp): Likewise.
* sysdeps/powerpc/powerpc32/strcpy.S (strcpy): Likewise.
* sysdeps/powerpc/powerpc32/strlen.S (strlen): Likewise.
* sysdeps/powerpc/powerpc64/memcpy.S (memcpy): Likewise.
* sysdeps/powerpc/powerpc64/memset.S (memset): Likewise.
* sysdeps/powerpc/powerpc64/strchr.S (strchr): Likewise.
* sysdeps/powerpc/powerpc64/strcmp.S (strcmp): Likewise.
* sysdeps/powerpc/powerpc64/strcpy.S (strcpy): Likewise.
* sysdeps/powerpc/powerpc64/strlen.S (strlen): Likewise.
* sysdeps/powerpc/strcat.c (strcat): Likewise.
* sysdeps/sparc/sparc32/memchr.S (memchr): Likewise.
* sysdeps/sparc/sparc32/memcpy.S (memcpy): Likewise.
* sysdeps/sparc/sparc32/memset.S (memset): Likewise.
* sysdeps/sparc/sparc32/strcat.S (strcat): Likewise.
* sysdeps/sparc/sparc32/strchr.S (strchr, strrchr): Likewise.
* sysdeps/sparc/sparc32/strcmp.S (strcmp): Likewise.
* sysdeps/sparc/sparc32/strcpy.S (strcpy): Likewise.
* sysdeps/sparc/sparc32/strlen.S (strlen): Likewise.
* sysdeps/sparc/sparc64/sparcv9b/memcpy.S (memcpy, memmove): Likewise.
* sysdeps/sparc/sparc64/memchr.S (memchr): Likewise.
* sysdeps/sparc/sparc64/memcpy.S (memcpy, memmove): Likewise.
* sysdeps/sparc/sparc64/memset.S (memset): Likewise.
* sysdeps/sparc/sparc64/strcat.S (strcat): Likewise.
* sysdeps/sparc/sparc64/strchr.S (strchr, strrchr): Likewise.
* sysdeps/sparc/sparc64/strcmp.S (strcmp): Likewise.
* sysdeps/sparc/sparc64/strcpy.S (strcpy): Likewise.
* sysdeps/sparc/sparc64/strcspn.S (strcspn): Likewise.
* sysdeps/sparc/sparc64/strlen.S (strlen): Likewise.
* sysdeps/sparc/sparc64/strncmp.S (strncmp): Likewise.
* sysdeps/sparc/sparc64/strncpy.S (strncpy): Likewise.
* sysdeps/sparc/sparc64/strpbrk.S (strpbrk): Likewise.
* sysdeps/sparc/sparc64/strspn.S (strspn): Likewise.
* sysdeps/sh/memcpy.S (memcpy): Likewise.
* sysdeps/sh/memset.S (memset): Likewise.
* sysdeps/sh/strlen.S (strlen): Likewise.
* sysdeps/s390/s390-32/memchr.S (memchr): Likewise.
* sysdeps/s390/s390-32/memcpy.S (memcpy): Likewise.
* sysdeps/s390/s390-32/memset.S (memset): Likewise.
* sysdeps/s390/s390-32/strcmp.S (strcmp): Likewise.
* sysdeps/s390/s390-32/strcpy.S (strcpy): Likewise.
* sysdeps/s390/s390-32/strncpy.S (strncpy): Likewise.
* sysdeps/s390/s390-64/memchr.S (memchr): Likewise.
* sysdeps/s390/s390-64/memcpy.S (memcpy): Likewise.
* sysdeps/s390/s390-64/memset.S (memset): Likewise.
* sysdeps/s390/s390-64/strcmp.S (strcmp): Likewise.
* sysdeps/s390/s390-64/strcpy.S (strcpy): Likewise.
* sysdeps/s390/s390-64/strncpy.S (strncpy): Likewise.
* sysdeps/x86_64/memcpy.S (memcpy): Likewise.
* sysdeps/x86_64/memset.S (memset): Likewise.
* sysdeps/x86_64/strcat.S (strcat): Likewise.
* sysdeps/x86_64/strchr.S (strchr): Likewise.
* sysdeps/x86_64/strcmp.S (strcmp): Likewise.
* sysdeps/x86_64/strcpy.S (strcpy): Likewise.
* sysdeps/x86_64/strcspn.S (strcspn): Likewise.
* sysdeps/x86_64/strlen.S (strlen): Likewise.
* sysdeps/x86_64/strspn.S (strspn): Likewise.
* string/string-inlines.c: Move...
* sysdeps/generic/string-inlines.c: ...here.
(__memcpy_g, __strchr_g): Remove.
(__NO_INLINE__): Define before including <string.h>,
undefine after. Include bits/string.h and bits/string2.h.
* sysdeps/i386/i486/string-inlines.c: New file.
* sysdeps/i386/string-inlines.c: New file.
* sysdeps/i386/i486/Versions: Remove.
All GLIBC_2.1.1 symbols moved...
* sysdeps/i386/Versions (libc): ...here.
2003-04-29 Ulrich Drepper <drepper@redhat.com>
2003-04-29 22:49:58 +00:00
|
|
|
#undef __NO_INLINE__
|
|
|
|
#include <bits/string.h>
|
|
|
|
#include <bits/string2.h>
|
Improve generic strcspn performance
Improve strcspn performance using a much faster algorithm. It is kept simple
so it works well on most targets. It is generally at least 10 times faster
than the existing implementation on bench-strcspn on a few AArch64
implementations, and for some tests 100 times as fast (repeatedly calling
strchr on a small string is extremely slow...).
In fact the string/bits/string2.h inlines make no longer sense, as GCC
already uses strlen if reject is an empty string, strchrnul is 5 times as
fast as __strcspn_c1, while __strcspn_c2 and __strcspn_c3 are slower than
the strcspn main loop for large strings (though reject length 2-4 could be
special cased in the future to gain even more performance).
Tested on x86_64, i686, and aarch64.
* string/Version (libc): Add GLIBC_2.24.
* string/strcspn.c (strcspn): Rewrite function.
* string/bits/string2.h (strcspn): Use __builtin_strcspn.
(__strcspn_c1): Remove inline function.
(__strcspn_c2): Likewise.
(__strcspn_c3): Likewise.
* string/string-inline.c
[SHLIB_COMPAT(libc, GLIBC_2_1_1, GLIBC_2_24)] (__strcspn_c1): Add
compatibility symbol.
[SHLIB_COMPAT(libc, GLIBC_2_1_1, GLIBC_2_24)] (__strcspn_c2):
Likewise.
[SHLIB_COMPAT(libc, GLIBC_2_1_1, GLIBC_2_24)] (__strcspn_c3):
Likewise.
* sysdeps/i386/string-inlines.c: Include generic string-inlines.c.
2016-03-25 19:44:26 +00:00
|
|
|
|
|
|
|
#include "shlib-compat.h"
|
|
|
|
|
2016-12-14 15:12:18 +00:00
|
|
|
#if SHLIB_COMPAT (libc, GLIBC_2_1_1, GLIBC_2_25)
|
|
|
|
/* The inline functions are not used from GLIBC 2.25 and forward, however
|
|
|
|
they are required to provide the symbols through string-inlines.c
|
|
|
|
(if inlining is not possible for compatibility reasons). */
|
|
|
|
|
|
|
|
char *
|
|
|
|
__old_strtok_r_1c (char *__s, char __sep, char **__nextp)
|
|
|
|
{
|
|
|
|
char *__result;
|
|
|
|
if (__s == NULL)
|
|
|
|
__s = *__nextp;
|
|
|
|
while (*__s == __sep)
|
|
|
|
++__s;
|
|
|
|
__result = NULL;
|
|
|
|
if (*__s != '\0')
|
|
|
|
{
|
|
|
|
__result = __s++;
|
|
|
|
while (*__s != '\0')
|
|
|
|
if (*__s++ == __sep)
|
|
|
|
{
|
|
|
|
__s[-1] = '\0';
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
*__nextp = __s;
|
|
|
|
return __result;
|
|
|
|
}
|
|
|
|
compat_symbol (libc, __old_strtok_r_1c, __strtok_r_1c, GLIBC_2_1_1);
|
2016-12-21 15:16:29 +00:00
|
|
|
|
|
|
|
char *
|
|
|
|
__old_strsep_1c (char **__s, char __reject)
|
|
|
|
{
|
|
|
|
char *__retval = *__s;
|
|
|
|
if (__retval != NULL && (*__s = strchr (__retval, __reject)) != NULL)
|
|
|
|
*(*__s)++ = '\0';
|
|
|
|
return __retval;
|
|
|
|
}
|
|
|
|
compat_symbol (libc, __old_strsep_1c, __strsep_1c, GLIBC_2_1_1);
|
|
|
|
|
|
|
|
char *
|
|
|
|
__old_strsep_2c (char **__s, char __reject1, char __reject2)
|
|
|
|
{
|
|
|
|
char *__retval = *__s;
|
|
|
|
if (__retval != NULL)
|
|
|
|
{
|
|
|
|
char *__cp = __retval;
|
|
|
|
while (1)
|
|
|
|
{
|
|
|
|
if (*__cp == '\0')
|
|
|
|
{
|
|
|
|
__cp = NULL;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
if (*__cp == __reject1 || *__cp == __reject2)
|
|
|
|
{
|
|
|
|
*__cp++ = '\0';
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
++__cp;
|
|
|
|
}
|
|
|
|
*__s = __cp;
|
|
|
|
}
|
|
|
|
return __retval;
|
|
|
|
}
|
|
|
|
compat_symbol (libc, __old_strsep_2c, __strsep_2c, GLIBC_2_1_1);
|
|
|
|
|
|
|
|
char *
|
|
|
|
__old_strsep_3c (char **__s, char __reject1, char __reject2, char __reject3)
|
|
|
|
{
|
|
|
|
char *__retval = *__s;
|
|
|
|
if (__retval != NULL)
|
|
|
|
{
|
|
|
|
char *__cp = __retval;
|
|
|
|
while (1)
|
|
|
|
{
|
|
|
|
if (*__cp == '\0')
|
|
|
|
{
|
|
|
|
__cp = NULL;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
if (*__cp == __reject1 || *__cp == __reject2 || *__cp == __reject3)
|
|
|
|
{
|
|
|
|
*__cp++ = '\0';
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
++__cp;
|
|
|
|
}
|
|
|
|
*__s = __cp;
|
|
|
|
}
|
|
|
|
return __retval;
|
|
|
|
}
|
|
|
|
compat_symbol (libc, __old_strsep_3c, __strsep_3c, GLIBC_2_1_1);
|
2016-12-14 15:12:18 +00:00
|
|
|
#endif
|
|
|
|
|
Improve generic strcspn performance
Improve strcspn performance using a much faster algorithm. It is kept simple
so it works well on most targets. It is generally at least 10 times faster
than the existing implementation on bench-strcspn on a few AArch64
implementations, and for some tests 100 times as fast (repeatedly calling
strchr on a small string is extremely slow...).
In fact the string/bits/string2.h inlines make no longer sense, as GCC
already uses strlen if reject is an empty string, strchrnul is 5 times as
fast as __strcspn_c1, while __strcspn_c2 and __strcspn_c3 are slower than
the strcspn main loop for large strings (though reject length 2-4 could be
special cased in the future to gain even more performance).
Tested on x86_64, i686, and aarch64.
* string/Version (libc): Add GLIBC_2.24.
* string/strcspn.c (strcspn): Rewrite function.
* string/bits/string2.h (strcspn): Use __builtin_strcspn.
(__strcspn_c1): Remove inline function.
(__strcspn_c2): Likewise.
(__strcspn_c3): Likewise.
* string/string-inline.c
[SHLIB_COMPAT(libc, GLIBC_2_1_1, GLIBC_2_24)] (__strcspn_c1): Add
compatibility symbol.
[SHLIB_COMPAT(libc, GLIBC_2_1_1, GLIBC_2_24)] (__strcspn_c2):
Likewise.
[SHLIB_COMPAT(libc, GLIBC_2_1_1, GLIBC_2_24)] (__strcspn_c3):
Likewise.
* sysdeps/i386/string-inlines.c: Include generic string-inlines.c.
2016-03-25 19:44:26 +00:00
|
|
|
#if SHLIB_COMPAT (libc, GLIBC_2_1_1, GLIBC_2_24)
|
|
|
|
/* The inline functions are not used from GLIBC 2.24 and forward, however
|
|
|
|
they are required to provide the symbols through string-inlines.c
|
|
|
|
(if inlining is not possible for compatibility reasons). */
|
|
|
|
size_t
|
|
|
|
__old_strcspn_c1 (const char *__s, int __reject)
|
|
|
|
{
|
|
|
|
size_t __result = 0;
|
|
|
|
while (__s[__result] != '\0' && __s[__result] != __reject)
|
|
|
|
++__result;
|
|
|
|
return __result;
|
|
|
|
}
|
|
|
|
compat_symbol (libc, __old_strcspn_c1, __strcspn_c1, GLIBC_2_1_1);
|
|
|
|
|
|
|
|
size_t
|
|
|
|
__old_strcspn_c2 (const char *__s, int __reject1, int __reject2)
|
|
|
|
{
|
|
|
|
size_t __result = 0;
|
|
|
|
while (__s[__result] != '\0' && __s[__result] != __reject1
|
|
|
|
&& __s[__result] != __reject2)
|
|
|
|
++__result;
|
|
|
|
return __result;
|
|
|
|
}
|
|
|
|
compat_symbol (libc, __old_strcspn_c2, __strcspn_c2, GLIBC_2_1_1);
|
|
|
|
|
|
|
|
size_t
|
|
|
|
__old_strcspn_c3 (const char *__s, int __reject1, int __reject2,
|
|
|
|
int __reject3)
|
|
|
|
{
|
|
|
|
size_t __result = 0;
|
|
|
|
while (__s[__result] != '\0' && __s[__result] != __reject1
|
|
|
|
&& __s[__result] != __reject2 && __s[__result] != __reject3)
|
|
|
|
++__result;
|
|
|
|
return __result;
|
|
|
|
}
|
|
|
|
compat_symbol (libc, __old_strcspn_c3, __strcspn_c3, GLIBC_2_1_1);
|
Improve generic strspn performance
As for strcspn, this patch improves strspn performance using a much
faster algorithm. It first constructs a 256-entry table based on
the accept string and then uses it as a lookup table for the
input string. As for strcspn optimization, it is generally at least
10 times faster than the existing implementation on bench-strspn
on a few AArch64 implementations.
Also the string/bits/string2.h inlines make no longer sense, as current
implementation will already implement most of the optimizations.
Tested on x86_64, i686, and aarch64.
* string/strspn.c (strcspn): Rewrite function.
* string/bits/string2.h (strspn): Use __builtin_strcspn.
(__strspn_c1): Remove inline function.
(__strspn_c2): Likewise.
(__strspn_c3): Likewise.
* string/string-inlines.c
[SHLIB_COMPAT(libc, GLIBC_2_1_1, GLIBC_2_24)] (__strspn_c1): Add
compatibility symbol.
[SHLIB_COMPAT(libc, GLIBC_2_1_1, GLIBC_2_24)] (__strspn_c2):
Likewise.
[SHLIB_COMPAT(libc, GLIBC_2_1_1, GLIBC_2_24)] (__strspn_c3):
Likewise.
2016-03-26 19:09:07 +00:00
|
|
|
|
|
|
|
size_t
|
|
|
|
__old_strspn_c1 (const char *__s, int __accept)
|
|
|
|
{
|
|
|
|
size_t __result = 0;
|
|
|
|
/* Please note that __accept never can be '\0'. */
|
|
|
|
while (__s[__result] == __accept)
|
|
|
|
++__result;
|
|
|
|
return __result;
|
|
|
|
}
|
|
|
|
compat_symbol (libc, __old_strspn_c1, __strspn_c1, GLIBC_2_1_1);
|
|
|
|
|
|
|
|
size_t
|
|
|
|
__old_strspn_c2 (const char *__s, int __accept1, int __accept2)
|
|
|
|
{
|
|
|
|
size_t __result = 0;
|
|
|
|
/* Please note that __accept1 and __accept2 never can be '\0'. */
|
|
|
|
while (__s[__result] == __accept1 || __s[__result] == __accept2)
|
|
|
|
++__result;
|
|
|
|
return __result;
|
|
|
|
}
|
|
|
|
compat_symbol (libc, __old_strspn_c2, __strspn_c2, GLIBC_2_1_1);
|
|
|
|
|
|
|
|
size_t
|
|
|
|
__old_strspn_c3 (const char *__s, int __accept1, int __accept2,
|
|
|
|
int __accept3)
|
|
|
|
{
|
|
|
|
size_t __result = 0;
|
|
|
|
/* Please note that __accept1 to __accept3 never can be '\0'. */
|
|
|
|
while (__s[__result] == __accept1 || __s[__result] == __accept2
|
|
|
|
|| __s[__result] == __accept3)
|
|
|
|
++__result;
|
|
|
|
return __result;
|
|
|
|
}
|
|
|
|
compat_symbol (libc, __old_strspn_c3, __strspn_c3, GLIBC_2_1_1);
|
|
|
|
|
2016-03-27 13:33:56 +00:00
|
|
|
char *
|
2016-04-18 14:26:11 +00:00
|
|
|
__old_strpbrk_c2 (const char *__s, int __accept1, int __accept2)
|
2016-03-27 13:33:56 +00:00
|
|
|
{
|
|
|
|
/* Please note that __accept1 and __accept2 never can be '\0'. */
|
|
|
|
while (*__s != '\0' && *__s != __accept1 && *__s != __accept2)
|
|
|
|
++__s;
|
|
|
|
return *__s == '\0' ? NULL : (char *) (size_t) __s;
|
|
|
|
}
|
|
|
|
compat_symbol (libc, __old_strpbrk_c2, __strpbrk_c2, GLIBC_2_1_1);
|
|
|
|
|
|
|
|
char *
|
2016-04-18 14:26:11 +00:00
|
|
|
__old_strpbrk_c3 (const char *__s, int __accept1, int __accept2, int __accept3)
|
2016-03-27 13:33:56 +00:00
|
|
|
{
|
|
|
|
/* Please note that __accept1 to __accept3 never can be '\0'. */
|
|
|
|
while (*__s != '\0' && *__s != __accept1 && *__s != __accept2
|
|
|
|
&& *__s != __accept3)
|
|
|
|
++__s;
|
|
|
|
return *__s == '\0' ? NULL : (char *) (size_t) __s;
|
|
|
|
}
|
|
|
|
compat_symbol (libc, __old_strpbrk_c3, __strpbrk_c3, GLIBC_2_1_1);
|
|
|
|
|
2016-04-18 14:26:11 +00:00
|
|
|
/* These are a few types we need for the optimizations if we cannot
|
|
|
|
use unaligned memory accesses. */
|
|
|
|
# define __STRING2_COPY_TYPE(N) \
|
|
|
|
typedef struct { unsigned char __arr[N]; } \
|
|
|
|
__attribute__ ((__packed__)) __STRING2_COPY_ARR##N
|
|
|
|
__STRING2_COPY_TYPE (2);
|
|
|
|
__STRING2_COPY_TYPE (3);
|
|
|
|
__STRING2_COPY_TYPE (4);
|
|
|
|
__STRING2_COPY_TYPE (5);
|
|
|
|
__STRING2_COPY_TYPE (6);
|
|
|
|
__STRING2_COPY_TYPE (7);
|
|
|
|
__STRING2_COPY_TYPE (8);
|
|
|
|
# undef __STRING2_COPY_TYPE
|
|
|
|
|
|
|
|
|
|
|
|
# if _STRING_INLINE_unaligned
|
|
|
|
void *
|
|
|
|
__old_mempcpy_small (void *__dest1,
|
|
|
|
char __src0_1, char __src2_1, char __src4_1, char __src6_1,
|
|
|
|
__uint16_t __src0_2, __uint16_t __src4_2,
|
|
|
|
__uint32_t __src0_4, __uint32_t __src4_4,
|
|
|
|
size_t __srclen)
|
|
|
|
{
|
|
|
|
union {
|
|
|
|
__uint32_t __ui;
|
|
|
|
__uint16_t __usi;
|
|
|
|
unsigned char __uc;
|
|
|
|
unsigned char __c;
|
|
|
|
} *__u = __dest1;
|
|
|
|
switch ((unsigned int) __srclen)
|
|
|
|
{
|
|
|
|
case 1:
|
|
|
|
__u->__c = __src0_1;
|
|
|
|
__u = __extension__ ((void *) __u + 1);
|
|
|
|
break;
|
|
|
|
case 2:
|
|
|
|
__u->__usi = __src0_2;
|
|
|
|
__u = __extension__ ((void *) __u + 2);
|
|
|
|
break;
|
|
|
|
case 3:
|
|
|
|
__u->__usi = __src0_2;
|
|
|
|
__u = __extension__ ((void *) __u + 2);
|
|
|
|
__u->__c = __src2_1;
|
|
|
|
__u = __extension__ ((void *) __u + 1);
|
|
|
|
break;
|
|
|
|
case 4:
|
|
|
|
__u->__ui = __src0_4;
|
|
|
|
__u = __extension__ ((void *) __u + 4);
|
|
|
|
break;
|
|
|
|
case 5:
|
|
|
|
__u->__ui = __src0_4;
|
|
|
|
__u = __extension__ ((void *) __u + 4);
|
|
|
|
__u->__c = __src4_1;
|
|
|
|
__u = __extension__ ((void *) __u + 1);
|
|
|
|
break;
|
|
|
|
case 6:
|
|
|
|
__u->__ui = __src0_4;
|
|
|
|
__u = __extension__ ((void *) __u + 4);
|
|
|
|
__u->__usi = __src4_2;
|
|
|
|
__u = __extension__ ((void *) __u + 2);
|
|
|
|
break;
|
|
|
|
case 7:
|
|
|
|
__u->__ui = __src0_4;
|
|
|
|
__u = __extension__ ((void *) __u + 4);
|
|
|
|
__u->__usi = __src4_2;
|
|
|
|
__u = __extension__ ((void *) __u + 2);
|
|
|
|
__u->__c = __src6_1;
|
|
|
|
__u = __extension__ ((void *) __u + 1);
|
|
|
|
break;
|
|
|
|
case 8:
|
|
|
|
__u->__ui = __src0_4;
|
|
|
|
__u = __extension__ ((void *) __u + 4);
|
|
|
|
__u->__ui = __src4_4;
|
|
|
|
__u = __extension__ ((void *) __u + 4);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
return (void *) __u;
|
|
|
|
}
|
|
|
|
|
|
|
|
# else
|
|
|
|
|
|
|
|
void *
|
|
|
|
__old_mempcpy_small (void *__dest, char __src1,
|
|
|
|
__STRING2_COPY_ARR2 __src2, __STRING2_COPY_ARR3 __src3,
|
|
|
|
__STRING2_COPY_ARR4 __src4, __STRING2_COPY_ARR5 __src5,
|
|
|
|
__STRING2_COPY_ARR6 __src6, __STRING2_COPY_ARR7 __src7,
|
|
|
|
__STRING2_COPY_ARR8 __src8, size_t __srclen)
|
|
|
|
{
|
|
|
|
union {
|
|
|
|
char __c;
|
|
|
|
__STRING2_COPY_ARR2 __sca2;
|
|
|
|
__STRING2_COPY_ARR3 __sca3;
|
|
|
|
__STRING2_COPY_ARR4 __sca4;
|
|
|
|
__STRING2_COPY_ARR5 __sca5;
|
|
|
|
__STRING2_COPY_ARR6 __sca6;
|
|
|
|
__STRING2_COPY_ARR7 __sca7;
|
|
|
|
__STRING2_COPY_ARR8 __sca8;
|
|
|
|
} *__u = __dest;
|
|
|
|
switch ((unsigned int) __srclen)
|
|
|
|
{
|
|
|
|
case 1:
|
|
|
|
__u->__c = __src1;
|
|
|
|
break;
|
|
|
|
case 2:
|
|
|
|
__extension__ __u->__sca2 = __src2;
|
|
|
|
break;
|
|
|
|
case 3:
|
|
|
|
__extension__ __u->__sca3 = __src3;
|
|
|
|
break;
|
|
|
|
case 4:
|
|
|
|
__extension__ __u->__sca4 = __src4;
|
|
|
|
break;
|
|
|
|
case 5:
|
|
|
|
__extension__ __u->__sca5 = __src5;
|
|
|
|
break;
|
|
|
|
case 6:
|
|
|
|
__extension__ __u->__sca6 = __src6;
|
|
|
|
break;
|
|
|
|
case 7:
|
|
|
|
__extension__ __u->__sca7 = __src7;
|
|
|
|
break;
|
|
|
|
case 8:
|
|
|
|
__extension__ __u->__sca8 = __src8;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
return __extension__ ((void *) __u + __srclen);
|
|
|
|
}
|
|
|
|
# endif
|
|
|
|
compat_symbol (libc, __old_mempcpy_small, __mempcpy_small, GLIBC_2_1_1);
|
|
|
|
|
|
|
|
# if _STRING_INLINE_unaligned
|
|
|
|
char *
|
|
|
|
__old_strcpy_small (char *__dest,
|
|
|
|
__uint16_t __src0_2, __uint16_t __src4_2,
|
|
|
|
__uint32_t __src0_4, __uint32_t __src4_4,
|
|
|
|
size_t __srclen)
|
|
|
|
{
|
|
|
|
union {
|
|
|
|
__uint32_t __ui;
|
|
|
|
__uint16_t __usi;
|
|
|
|
unsigned char __uc;
|
|
|
|
} *__u = (void *) __dest;
|
|
|
|
switch ((unsigned int) __srclen)
|
|
|
|
{
|
|
|
|
case 1:
|
|
|
|
__u->__uc = '\0';
|
|
|
|
break;
|
|
|
|
case 2:
|
|
|
|
__u->__usi = __src0_2;
|
|
|
|
break;
|
|
|
|
case 3:
|
|
|
|
__u->__usi = __src0_2;
|
|
|
|
__u = __extension__ ((void *) __u + 2);
|
|
|
|
__u->__uc = '\0';
|
|
|
|
break;
|
|
|
|
case 4:
|
|
|
|
__u->__ui = __src0_4;
|
|
|
|
break;
|
|
|
|
case 5:
|
|
|
|
__u->__ui = __src0_4;
|
|
|
|
__u = __extension__ ((void *) __u + 4);
|
|
|
|
__u->__uc = '\0';
|
|
|
|
break;
|
|
|
|
case 6:
|
|
|
|
__u->__ui = __src0_4;
|
|
|
|
__u = __extension__ ((void *) __u + 4);
|
|
|
|
__u->__usi = __src4_2;
|
|
|
|
break;
|
|
|
|
case 7:
|
|
|
|
__u->__ui = __src0_4;
|
|
|
|
__u = __extension__ ((void *) __u + 4);
|
|
|
|
__u->__usi = __src4_2;
|
|
|
|
__u = __extension__ ((void *) __u + 2);
|
|
|
|
__u->__uc = '\0';
|
|
|
|
break;
|
|
|
|
case 8:
|
|
|
|
__u->__ui = __src0_4;
|
|
|
|
__u = __extension__ ((void *) __u + 4);
|
|
|
|
__u->__ui = __src4_4;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
return __dest;
|
|
|
|
}
|
|
|
|
|
|
|
|
# else
|
|
|
|
|
|
|
|
char *
|
|
|
|
__old_strcpy_small (char *__dest,
|
|
|
|
__STRING2_COPY_ARR2 __src2, __STRING2_COPY_ARR3 __src3,
|
|
|
|
__STRING2_COPY_ARR4 __src4, __STRING2_COPY_ARR5 __src5,
|
|
|
|
__STRING2_COPY_ARR6 __src6, __STRING2_COPY_ARR7 __src7,
|
|
|
|
__STRING2_COPY_ARR8 __src8, size_t __srclen)
|
|
|
|
{
|
|
|
|
union {
|
|
|
|
char __c;
|
|
|
|
__STRING2_COPY_ARR2 __sca2;
|
|
|
|
__STRING2_COPY_ARR3 __sca3;
|
|
|
|
__STRING2_COPY_ARR4 __sca4;
|
|
|
|
__STRING2_COPY_ARR5 __sca5;
|
|
|
|
__STRING2_COPY_ARR6 __sca6;
|
|
|
|
__STRING2_COPY_ARR7 __sca7;
|
|
|
|
__STRING2_COPY_ARR8 __sca8;
|
|
|
|
} *__u = (void *) __dest;
|
|
|
|
switch ((unsigned int) __srclen)
|
|
|
|
{
|
|
|
|
case 1:
|
|
|
|
__u->__c = '\0';
|
|
|
|
break;
|
|
|
|
case 2:
|
|
|
|
__extension__ __u->__sca2 = __src2;
|
|
|
|
break;
|
|
|
|
case 3:
|
|
|
|
__extension__ __u->__sca3 = __src3;
|
|
|
|
break;
|
|
|
|
case 4:
|
|
|
|
__extension__ __u->__sca4 = __src4;
|
|
|
|
break;
|
|
|
|
case 5:
|
|
|
|
__extension__ __u->__sca5 = __src5;
|
|
|
|
break;
|
|
|
|
case 6:
|
|
|
|
__extension__ __u->__sca6 = __src6;
|
|
|
|
break;
|
|
|
|
case 7:
|
|
|
|
__extension__ __u->__sca7 = __src7;
|
|
|
|
break;
|
|
|
|
case 8:
|
|
|
|
__extension__ __u->__sca8 = __src8;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
return __dest;
|
|
|
|
}
|
|
|
|
# endif
|
|
|
|
compat_symbol (libc, __old_strcpy_small, __strcpy_small, GLIBC_2_1_1);
|
|
|
|
|
|
|
|
# if _STRING_INLINE_unaligned
|
|
|
|
char *
|
|
|
|
__old_stpcpy_small (char *__dest,
|
|
|
|
__uint16_t __src0_2, __uint16_t __src4_2,
|
|
|
|
__uint32_t __src0_4, __uint32_t __src4_4,
|
|
|
|
size_t __srclen)
|
|
|
|
{
|
|
|
|
union {
|
|
|
|
unsigned int __ui;
|
|
|
|
unsigned short int __usi;
|
|
|
|
unsigned char __uc;
|
|
|
|
char __c;
|
|
|
|
} *__u = (void *) __dest;
|
|
|
|
switch ((unsigned int) __srclen)
|
|
|
|
{
|
|
|
|
case 1:
|
|
|
|
__u->__uc = '\0';
|
|
|
|
break;
|
|
|
|
case 2:
|
|
|
|
__u->__usi = __src0_2;
|
|
|
|
__u = __extension__ ((void *) __u + 1);
|
|
|
|
break;
|
|
|
|
case 3:
|
|
|
|
__u->__usi = __src0_2;
|
|
|
|
__u = __extension__ ((void *) __u + 2);
|
|
|
|
__u->__uc = '\0';
|
|
|
|
break;
|
|
|
|
case 4:
|
|
|
|
__u->__ui = __src0_4;
|
|
|
|
__u = __extension__ ((void *) __u + 3);
|
|
|
|
break;
|
|
|
|
case 5:
|
|
|
|
__u->__ui = __src0_4;
|
|
|
|
__u = __extension__ ((void *) __u + 4);
|
|
|
|
__u->__uc = '\0';
|
|
|
|
break;
|
|
|
|
case 6:
|
|
|
|
__u->__ui = __src0_4;
|
|
|
|
__u = __extension__ ((void *) __u + 4);
|
|
|
|
__u->__usi = __src4_2;
|
|
|
|
__u = __extension__ ((void *) __u + 1);
|
|
|
|
break;
|
|
|
|
case 7:
|
|
|
|
__u->__ui = __src0_4;
|
|
|
|
__u = __extension__ ((void *) __u + 4);
|
|
|
|
__u->__usi = __src4_2;
|
|
|
|
__u = __extension__ ((void *) __u + 2);
|
|
|
|
__u->__uc = '\0';
|
|
|
|
break;
|
|
|
|
case 8:
|
|
|
|
__u->__ui = __src0_4;
|
|
|
|
__u = __extension__ ((void *) __u + 4);
|
|
|
|
__u->__ui = __src4_4;
|
|
|
|
__u = __extension__ ((void *) __u + 3);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
return &__u->__c;
|
|
|
|
}
|
|
|
|
|
|
|
|
# else
|
|
|
|
|
|
|
|
char *
|
|
|
|
__old_stpcpy_small (char *__dest,
|
|
|
|
__STRING2_COPY_ARR2 __src2, __STRING2_COPY_ARR3 __src3,
|
|
|
|
__STRING2_COPY_ARR4 __src4, __STRING2_COPY_ARR5 __src5,
|
|
|
|
__STRING2_COPY_ARR6 __src6, __STRING2_COPY_ARR7 __src7,
|
|
|
|
__STRING2_COPY_ARR8 __src8, size_t __srclen)
|
|
|
|
{
|
|
|
|
union {
|
|
|
|
char __c;
|
|
|
|
__STRING2_COPY_ARR2 __sca2;
|
|
|
|
__STRING2_COPY_ARR3 __sca3;
|
|
|
|
__STRING2_COPY_ARR4 __sca4;
|
|
|
|
__STRING2_COPY_ARR5 __sca5;
|
|
|
|
__STRING2_COPY_ARR6 __sca6;
|
|
|
|
__STRING2_COPY_ARR7 __sca7;
|
|
|
|
__STRING2_COPY_ARR8 __sca8;
|
|
|
|
} *__u = (void *) __dest;
|
|
|
|
switch ((unsigned int) __srclen)
|
|
|
|
{
|
|
|
|
case 1:
|
|
|
|
__u->__c = '\0';
|
|
|
|
break;
|
|
|
|
case 2:
|
|
|
|
__extension__ __u->__sca2 = __src2;
|
|
|
|
break;
|
|
|
|
case 3:
|
|
|
|
__extension__ __u->__sca3 = __src3;
|
|
|
|
break;
|
|
|
|
case 4:
|
|
|
|
__extension__ __u->__sca4 = __src4;
|
|
|
|
break;
|
|
|
|
case 5:
|
|
|
|
__extension__ __u->__sca5 = __src5;
|
|
|
|
break;
|
|
|
|
case 6:
|
|
|
|
__extension__ __u->__sca6 = __src6;
|
|
|
|
break;
|
|
|
|
case 7:
|
|
|
|
__extension__ __u->__sca7 = __src7;
|
|
|
|
break;
|
|
|
|
case 8:
|
|
|
|
__extension__ __u->__sca8 = __src8;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
return __dest + __srclen - 1;
|
|
|
|
}
|
|
|
|
# endif
|
|
|
|
compat_symbol (libc, __old_stpcpy_small, __stpcpy_small, GLIBC_2_1_1);
|
|
|
|
|
Improve generic strcspn performance
Improve strcspn performance using a much faster algorithm. It is kept simple
so it works well on most targets. It is generally at least 10 times faster
than the existing implementation on bench-strcspn on a few AArch64
implementations, and for some tests 100 times as fast (repeatedly calling
strchr on a small string is extremely slow...).
In fact the string/bits/string2.h inlines make no longer sense, as GCC
already uses strlen if reject is an empty string, strchrnul is 5 times as
fast as __strcspn_c1, while __strcspn_c2 and __strcspn_c3 are slower than
the strcspn main loop for large strings (though reject length 2-4 could be
special cased in the future to gain even more performance).
Tested on x86_64, i686, and aarch64.
* string/Version (libc): Add GLIBC_2.24.
* string/strcspn.c (strcspn): Rewrite function.
* string/bits/string2.h (strcspn): Use __builtin_strcspn.
(__strcspn_c1): Remove inline function.
(__strcspn_c2): Likewise.
(__strcspn_c3): Likewise.
* string/string-inline.c
[SHLIB_COMPAT(libc, GLIBC_2_1_1, GLIBC_2_24)] (__strcspn_c1): Add
compatibility symbol.
[SHLIB_COMPAT(libc, GLIBC_2_1_1, GLIBC_2_24)] (__strcspn_c2):
Likewise.
[SHLIB_COMPAT(libc, GLIBC_2_1_1, GLIBC_2_24)] (__strcspn_c3):
Likewise.
* sysdeps/i386/string-inlines.c: Include generic string-inlines.c.
2016-03-25 19:44:26 +00:00
|
|
|
#endif
|