This is the mail archive of the libc-hacker@sources.redhat.com mailing list for the glibc project.

Note that libc-hacker is a closed list. You may look at the archives of this list, but subscription and posting are not open.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]

[PATCH] Don't "optimize" strchr(x, 0) on sparc


Hi!

sparc/sparc32/strchr.S and sparc/sparc64/strchr.S are optimized even for the
case where the second argument is 0, so on sparc* we should get rid of the
strchr(x, '\0') -> __rawmemchr(x, '\0') optimization (rawmemchr even in
assembly does not special case this and has to compute c * 0x01010101 and
has to do one additional xor inside of the loop.
_HAVE_STRING_ARCH macros were used for 2 purposes: to find out whether
bits/string2.h should define its own and to find out whether that particular
function will be expanded inline. This patch separates them into
_HAVE_STRING_ARCH macros (the first meaning) and _USE_STRING_ARCH (the
latter) - eventhough we define _HAVE_STRING_ARCH_strchr on sparc, we don't
want strncat to be optimized into two function calls instead of one.

2000-11-08  Jakub Jelinek  <jakub@redhat.com>

	* string/bits/string2.h: Check if _USE_STRING_ARCH_ macros are
	defined, not _HAVE_STRING_ARCH_.
	* sysdeps/i386/bits/string.h (_USE_STRING_ARCH_memset,
	_USE_STRING_ARCH_strchr): Define.
	* sysdeps/i386/i486/bits/string.h (_USE_STRING_ARCH_memset,
	_USE_STRING_ARCH_strchr): Define.
	* sysdeps/sparc/bits/string.h: New.

--- libc/string/bits/string2.h.jj	Thu Nov  2 08:52:18 2000
+++ libc/string/bits/string2.h	Wed Nov  8 12:35:35 2000
@@ -698,7 +698,7 @@ __stpcpy_small (char *__dest,
 
 /* Copy no more than N characters of SRC to DEST.  */
 #ifndef _HAVE_STRING_ARCH_strncpy
-# if defined _HAVE_STRING_ARCH_memset && defined _HAVE_STRING_ARCH_mempcpy
+# if defined _USE_STRING_ARCH_memset && defined _USE_STRING_ARCH_mempcpy
 #  define strncpy(dest, src, n) \
   (__extension__ ({ char *__dest = (dest);				      \
 		    __builtin_constant_p (src) && __builtin_constant_p (n)    \
@@ -721,7 +721,7 @@ __stpcpy_small (char *__dest,
 
 /* Append no more than N characters from SRC onto DEST.  */
 #ifndef _HAVE_STRING_ARCH_strncat
-# ifdef _HAVE_STRING_ARCH_strchr
+# ifdef _USE_STRING_ARCH_strchr
 #  define strncat(dest, src, n) \
   (__extension__ ({ char *__dest = (dest);				      \
 		    __builtin_constant_p (src) && __builtin_constant_p (n)    \
--- libc/sysdeps/i386/bits/string.h.jj	Thu Jul 27 16:04:13 2000
+++ libc/sysdeps/i386/bits/string.h	Wed Nov  8 12:37:04 2000
@@ -176,6 +176,7 @@ memmove (void *__dest, __const void *__s
 
 /* Set N bytes of S to C.  */
 #define _HAVE_STRING_ARCH_memset 1
+#define _USE_STRING_ARCH_memset 1
 #define memset(s, c, n) \
   (__extension__ (__builtin_constant_p (c)				      \
 		  ? (__builtin_constant_p (n)				      \
@@ -513,6 +514,7 @@ strncmp (__const char *__s1, __const cha
 
 /* Find the first occurrence of C in S.  */
 #define _HAVE_STRING_ARCH_strchr 1
+#define _USE_STRING_ARCH_strchr 1
 #define strchr(s, c) \
   (__extension__ (__builtin_constant_p (c)				      \
 		  ? __strchr_c (s, ((c) & 0xff) << 8)			      \
--- libc/sysdeps/i386/i486/bits/string.h.jj	Tue Nov  7 08:40:26 2000
+++ libc/sysdeps/i386/i486/bits/string.h	Wed Nov  8 12:38:05 2000
@@ -192,6 +192,7 @@ memcmp (__const void *__s1, __const void
 
 /* Set N bytes of S to C.  */
 #define _HAVE_STRING_ARCH_memset 1
+#define _USE_STRING_ARCH_memset 1
 #define memset(s, c, n) \
   (__extension__ (__builtin_constant_p (n) && (n) <= 16			      \
 		  ? ((n) == 1						      \
@@ -1188,6 +1189,7 @@ __strncmp_g (__const char *__s1, __const
 
 /* Find the first occurrence of C in S.  */
 #define _HAVE_STRING_ARCH_strchr 1
+#define _USE_STRING_ARCH_strchr 1
 #define strchr(s, c) \
   (__extension__ (__builtin_constant_p (c)				      \
 		  ? ((c) == '\0'					      \
--- libc/sysdeps/sparc/bits/string.h.jj	Wed Nov  8 12:19:43 2000
+++ libc/sysdeps/sparc/bits/string.h	Wed Nov  8 12:41:15 2000
@@ -0,0 +1,26 @@
+/* Optimized, inlined string functions.  SPARC version.
+   Copyright (C) 2000 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Library General Public License as
+   published by the Free Software Foundation; either version 2 of the
+   License, or (at your option) any later version.
+
+   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
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with the GNU C Library; see the file COPYING.LIB.  If not,
+   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.  */
+
+#ifndef _STRING_H
+# error "Never use <bits/string.h> directly; include <string.h> instead."
+#endif
+
+/* sparc32 and sparc64 strchr(x, '\0') perform better than
+   __rawmemchr(x, '\0').  */
+#define _HAVE_STRING_ARCH_strchr 1

	Jakub

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]