mirror of
https://sourceware.org/git/glibc.git
synced 2024-12-23 03:10:05 +00:00
Provide 32-bit inline string functions for >= i486
This commit is contained in:
parent
48495318fa
commit
6704c645b0
@ -1,6 +1,9 @@
|
||||
2012-06-04 H.J. Lu <hongjiu.lu@intel.com>
|
||||
|
||||
[BZ #14117]
|
||||
* sysdeps/i386/i486/bits/string.h: Define inline functions only
|
||||
if not compiling for x86-64, but compiling for >= i486.
|
||||
|
||||
* sysdeps/unix/sysv/linux/x86_64/bits/sigcontext.h: Renamed to ...
|
||||
* sysdeps/unix/sysv/linux/x86/bits/sigcontext.h: This.
|
||||
|
||||
|
@ -1,6 +1,5 @@
|
||||
/* Optimized, inlined string functions. i486 version.
|
||||
Copyright (C) 1997,1998,1999,2000,2001,2002,2003,2004,2007,2011,2012
|
||||
Free Software Foundation, Inc.
|
||||
/* Optimized, inlined string functions. i486/x86-64 version.
|
||||
Copyright (C) 2001-2012 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
|
||||
@ -24,25 +23,34 @@
|
||||
/* The ix86 processors can access unaligned multi-byte variables. */
|
||||
#define _STRING_ARCH_unaligned 1
|
||||
|
||||
/* Enable inline functions only for i486 or bette when compiling for
|
||||
ia32. */
|
||||
#if !defined __x86_64__ && (defined __i486__ || defined __pentium__ \
|
||||
|| defined __pentiumpro__ || defined __pentium4__ \
|
||||
|| defined __nocona__ || defined __atom__ \
|
||||
|| defined __core2__ || defined __corei7__ \
|
||||
|| defined __k6__ || defined __geode__ \
|
||||
|| defined __k8__ || defined __athlon__ \
|
||||
|| defined __amdfam10__)
|
||||
|
||||
/* We only provide optimizations if the user selects them and if
|
||||
GNU CC is used. */
|
||||
#if !defined __NO_STRING_INLINES && defined __USE_STRING_INLINES \
|
||||
# if !defined __NO_STRING_INLINES && defined __USE_STRING_INLINES \
|
||||
&& defined __GNUC__ && __GNUC__ >= 2 && !__BOUNDED_POINTERS__
|
||||
|
||||
#ifndef __STRING_INLINE
|
||||
# ifndef __extern_inline
|
||||
# define __STRING_INLINE inline
|
||||
# else
|
||||
# define __STRING_INLINE __extern_inline
|
||||
# ifndef __STRING_INLINE
|
||||
# ifndef __extern_inline
|
||||
# define __STRING_INLINE inline
|
||||
# else
|
||||
# define __STRING_INLINE __extern_inline
|
||||
# endif
|
||||
# endif
|
||||
#endif
|
||||
|
||||
/* The macros are used in some of the optimized implementations below. */
|
||||
#define __STRING_SMALL_GET16(src, idx) \
|
||||
# define __STRING_SMALL_GET16(src, idx) \
|
||||
((((const unsigned char *) (src))[idx + 1] << 8) \
|
||||
| ((const unsigned char *) (src))[idx])
|
||||
#define __STRING_SMALL_GET32(src, idx) \
|
||||
# define __STRING_SMALL_GET32(src, idx) \
|
||||
(((((const unsigned char *) (src))[idx + 3] << 8 \
|
||||
| ((const unsigned char *) (src))[idx + 2]) << 8 \
|
||||
| ((const unsigned char *) (src))[idx + 1]) << 8 \
|
||||
@ -50,12 +58,12 @@
|
||||
|
||||
|
||||
/* Copy N bytes of SRC to DEST. */
|
||||
#define _HAVE_STRING_ARCH_memcpy 1
|
||||
#define memcpy(dest, src, n) \
|
||||
# define _HAVE_STRING_ARCH_memcpy 1
|
||||
# define memcpy(dest, src, n) \
|
||||
(__extension__ (__builtin_constant_p (n) \
|
||||
? __memcpy_c ((dest), (src), (n)) \
|
||||
: __memcpy_g ((dest), (src), (n))))
|
||||
#define __memcpy_c(dest, src, n) \
|
||||
# define __memcpy_c(dest, src, n) \
|
||||
((n) == 0 \
|
||||
? (dest) \
|
||||
: (((n) % 4 == 0) \
|
||||
@ -139,11 +147,11 @@ __memcpy_g (void *__dest, const void *__src, size_t __n)
|
||||
return __dest;
|
||||
}
|
||||
|
||||
#define _HAVE_STRING_ARCH_memmove 1
|
||||
#ifndef _FORCE_INLINES
|
||||
# define _HAVE_STRING_ARCH_memmove 1
|
||||
# ifndef _FORCE_INLINES
|
||||
/* Copy N bytes of SRC to DEST, guaranteeing
|
||||
correct behavior for overlapping strings. */
|
||||
#define memmove(dest, src, n) __memmove_g (dest, src, n)
|
||||
# define memmove(dest, src, n) __memmove_g (dest, src, n)
|
||||
|
||||
__STRING_INLINE void *__memmove_g (void *, const void *, size_t)
|
||||
__asm__ ("memmove");
|
||||
@ -173,12 +181,12 @@ __memmove_g (void *__dest, const void *__src, size_t __n)
|
||||
"m" ( *(struct { __extension__ char __x[__n]; } *)__src));
|
||||
return __dest;
|
||||
}
|
||||
#endif
|
||||
# endif
|
||||
|
||||
/* Compare N bytes of S1 and S2. */
|
||||
#define _HAVE_STRING_ARCH_memcmp 1
|
||||
#ifndef _FORCE_INLINES
|
||||
# ifndef __PIC__
|
||||
# define _HAVE_STRING_ARCH_memcmp 1
|
||||
# ifndef _FORCE_INLINES
|
||||
# ifndef __PIC__
|
||||
/* gcc has problems to spill registers when using PIC. */
|
||||
__STRING_INLINE int
|
||||
memcmp (const void *__s1, const void *__s2, size_t __n)
|
||||
@ -200,13 +208,13 @@ memcmp (const void *__s1, const void *__s2, size_t __n)
|
||||
: "cc");
|
||||
return __res;
|
||||
}
|
||||
# endif
|
||||
# endif
|
||||
#endif
|
||||
|
||||
/* Set N bytes of S to C. */
|
||||
#define _HAVE_STRING_ARCH_memset 1
|
||||
#define _USE_STRING_ARCH_memset 1
|
||||
#define memset(s, c, n) \
|
||||
# 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 \
|
||||
? __memset_c1 ((s), (c)) \
|
||||
@ -219,11 +227,11 @@ memcmp (const void *__s1, const void *__s2, size_t __n)
|
||||
? __memset_gcn ((s), (c), (n)) \
|
||||
: memset ((s), (c), (n))))))
|
||||
|
||||
#define __memset_c1(s, c) ({ void *__s = (s); \
|
||||
*((unsigned char *) __s) = (unsigned char) (c); \
|
||||
__s; })
|
||||
# define __memset_c1(s, c) ({ void *__s = (s); \
|
||||
*((unsigned char *) __s) = (unsigned char) (c); \
|
||||
__s; })
|
||||
|
||||
#define __memset_gc(s, c, n) \
|
||||
# define __memset_gc(s, c, n) \
|
||||
({ void *__s = (s); \
|
||||
union { \
|
||||
unsigned int __ui; \
|
||||
@ -300,7 +308,7 @@ memcmp (const void *__s1, const void *__s2, size_t __n)
|
||||
\
|
||||
__s; })
|
||||
|
||||
#define __memset_ccn(s, c, n) \
|
||||
# define __memset_ccn(s, c, n) \
|
||||
(((n) % 4 == 0) \
|
||||
? __memset_ccn_by4 (s, ((unsigned int) ((unsigned char) (c))) * 0x01010101,\
|
||||
n) \
|
||||
@ -318,7 +326,7 @@ __memset_ccn_by4 (void *__s, unsigned int __c, size_t __n)
|
||||
{
|
||||
register void *__tmp = __s;
|
||||
register unsigned long int __d0;
|
||||
#ifdef __i686__
|
||||
# ifdef __i686__
|
||||
__asm__ __volatile__
|
||||
("cld\n\t"
|
||||
"rep; stosl"
|
||||
@ -326,7 +334,7 @@ __memset_ccn_by4 (void *__s, unsigned int __c, size_t __n)
|
||||
"=m" ( *(struct { __extension__ char __x[__n]; } *)__s)
|
||||
: "0" ((unsigned int) __c), "1" (__tmp), "2" (__n / 4)
|
||||
: "cc");
|
||||
#else
|
||||
# else
|
||||
__asm__ __volatile__
|
||||
("1:\n\t"
|
||||
"movl %0,(%1)\n\t"
|
||||
@ -337,7 +345,7 @@ __memset_ccn_by4 (void *__s, unsigned int __c, size_t __n)
|
||||
"=m" ( *(struct { __extension__ char __x[__n]; } *)__s)
|
||||
: "0" ((unsigned int) __c), "1" (__tmp), "2" (__n / 4)
|
||||
: "cc");
|
||||
#endif
|
||||
# endif
|
||||
return __s;
|
||||
}
|
||||
|
||||
@ -349,7 +357,7 @@ __memset_ccn_by2 (void *__s, unsigned int __c, size_t __n)
|
||||
{
|
||||
register unsigned long int __d0, __d1;
|
||||
register void *__tmp = __s;
|
||||
#ifdef __i686__
|
||||
# ifdef __i686__
|
||||
__asm__ __volatile__
|
||||
("cld\n\t"
|
||||
"rep; stosl\n"
|
||||
@ -358,7 +366,7 @@ __memset_ccn_by2 (void *__s, unsigned int __c, size_t __n)
|
||||
"=m" ( *(struct { __extension__ char __x[__n]; } *)__s)
|
||||
: "0" ((unsigned int) __c), "1" (__tmp), "2" (__n / 4)
|
||||
: "cc");
|
||||
#else
|
||||
# else
|
||||
__asm__ __volatile__
|
||||
("1:\tmovl %0,(%1)\n\t"
|
||||
"leal 4(%1),%1\n\t"
|
||||
@ -373,7 +381,7 @@ __memset_ccn_by2 (void *__s, unsigned int __c, size_t __n)
|
||||
return __s;
|
||||
}
|
||||
|
||||
#define __memset_gcn(s, c, n) \
|
||||
# define __memset_gcn(s, c, n) \
|
||||
(((n) % 4 == 0) \
|
||||
? __memset_gcn_by4 (s, c, n) \
|
||||
: (((n) % 2 == 0) \
|
||||
@ -431,19 +439,19 @@ __memset_gcn_by2 (void *__s, int __c, size_t __n)
|
||||
|
||||
|
||||
/* Search N bytes of S for C. */
|
||||
#define _HAVE_STRING_ARCH_memchr 1
|
||||
#ifndef _FORCE_INLINES
|
||||
# define _HAVE_STRING_ARCH_memchr 1
|
||||
# ifndef _FORCE_INLINES
|
||||
__STRING_INLINE void *
|
||||
memchr (const void *__s, int __c, size_t __n)
|
||||
{
|
||||
register unsigned long int __d0;
|
||||
#ifdef __i686__
|
||||
# ifdef __i686__
|
||||
register unsigned long int __d1;
|
||||
#endif
|
||||
# endif
|
||||
register unsigned char *__res;
|
||||
if (__n == 0)
|
||||
return NULL;
|
||||
#ifdef __i686__
|
||||
# ifdef __i686__
|
||||
__asm__ __volatile__
|
||||
("cld\n\t"
|
||||
"repne; scasb\n\t"
|
||||
@ -452,7 +460,7 @@ memchr (const void *__s, int __c, size_t __n)
|
||||
: "a" (__c), "0" (__s), "1" (__n), "2" (1),
|
||||
"m" ( *(struct { __extension__ char __x[__n]; } *)__s)
|
||||
: "cc");
|
||||
#else
|
||||
# else
|
||||
__asm__ __volatile__
|
||||
("cld\n\t"
|
||||
"repne; scasb\n\t"
|
||||
@ -463,26 +471,26 @@ memchr (const void *__s, int __c, size_t __n)
|
||||
: "a" (__c), "0" (__s), "1" (__n),
|
||||
"m" ( *(struct { __extension__ char __x[__n]; } *)__s)
|
||||
: "cc");
|
||||
#endif
|
||||
# endif
|
||||
return __res - 1;
|
||||
}
|
||||
#endif
|
||||
# endif
|
||||
|
||||
#define _HAVE_STRING_ARCH_memrchr 1
|
||||
#ifndef _FORCE_INLINES
|
||||
# define _HAVE_STRING_ARCH_memrchr 1
|
||||
# ifndef _FORCE_INLINES
|
||||
__STRING_INLINE void *__memrchr (const void *__s, int __c, size_t __n);
|
||||
|
||||
__STRING_INLINE void *
|
||||
__memrchr (const void *__s, int __c, size_t __n)
|
||||
{
|
||||
register unsigned long int __d0;
|
||||
# ifdef __i686__
|
||||
# ifdef __i686__
|
||||
register unsigned long int __d1;
|
||||
# endif
|
||||
# endif
|
||||
register void *__res;
|
||||
if (__n == 0)
|
||||
return NULL;
|
||||
# ifdef __i686__
|
||||
# ifdef __i686__
|
||||
__asm__ __volatile__
|
||||
("std\n\t"
|
||||
"repne; scasb\n\t"
|
||||
@ -493,7 +501,7 @@ __memrchr (const void *__s, int __c, size_t __n)
|
||||
: "a" (__c), "0" (__s + __n - 1), "1" (__n), "2" (-1),
|
||||
"m" ( *(struct { __extension__ char __x[__n]; } *)__s)
|
||||
: "cc");
|
||||
# else
|
||||
# else
|
||||
__asm__ __volatile__
|
||||
("std\n\t"
|
||||
"repne; scasb\n\t"
|
||||
@ -505,19 +513,19 @@ __memrchr (const void *__s, int __c, size_t __n)
|
||||
: "a" (__c), "0" (__s + __n - 1), "1" (__n),
|
||||
"m" ( *(struct { __extension__ char __x[__n]; } *)__s)
|
||||
: "cc");
|
||||
# endif
|
||||
# endif
|
||||
return __res;
|
||||
}
|
||||
# ifdef __USE_GNU
|
||||
# define memrchr(s, c, n) __memrchr ((s), (c), (n))
|
||||
# ifdef __USE_GNU
|
||||
# define memrchr(s, c, n) __memrchr ((s), (c), (n))
|
||||
# endif
|
||||
# endif
|
||||
#endif
|
||||
|
||||
/* Return pointer to C in S. */
|
||||
#define _HAVE_STRING_ARCH_rawmemchr 1
|
||||
# define _HAVE_STRING_ARCH_rawmemchr 1
|
||||
__STRING_INLINE void *__rawmemchr (const void *__s, int __c);
|
||||
|
||||
#ifndef _FORCE_INLINES
|
||||
# ifndef _FORCE_INLINES
|
||||
__STRING_INLINE void *
|
||||
__rawmemchr (const void *__s, int __c)
|
||||
{
|
||||
@ -532,19 +540,19 @@ __rawmemchr (const void *__s, int __c)
|
||||
: "cc");
|
||||
return __res - 1;
|
||||
}
|
||||
# ifdef __USE_GNU
|
||||
# ifdef __USE_GNU
|
||||
__STRING_INLINE void *
|
||||
rawmemchr (const void *__s, int __c)
|
||||
{
|
||||
return __rawmemchr (__s, __c);
|
||||
}
|
||||
# endif /* use GNU */
|
||||
#endif
|
||||
# endif /* use GNU */
|
||||
# endif
|
||||
|
||||
|
||||
/* Return the length of S. */
|
||||
#define _HAVE_STRING_ARCH_strlen 1
|
||||
#define strlen(str) \
|
||||
# define _HAVE_STRING_ARCH_strlen 1
|
||||
# define strlen(str) \
|
||||
(__extension__ (__builtin_constant_p (str) \
|
||||
? __builtin_strlen (str) \
|
||||
: __strlen_g (str)))
|
||||
@ -570,8 +578,8 @@ __strlen_g (const char *__str)
|
||||
|
||||
|
||||
/* Copy SRC to DEST. */
|
||||
#define _HAVE_STRING_ARCH_strcpy 1
|
||||
#define strcpy(dest, src) \
|
||||
# define _HAVE_STRING_ARCH_strcpy 1
|
||||
# define strcpy(dest, src) \
|
||||
(__extension__ (__builtin_constant_p (src) \
|
||||
? (sizeof ((src)[0]) == 1 && strlen (src) + 1 <= 8 \
|
||||
? __strcpy_a_small ((dest), (src), strlen (src) + 1) \
|
||||
@ -580,7 +588,7 @@ __strlen_g (const char *__str)
|
||||
strlen (src) + 1)) \
|
||||
: __strcpy_g ((dest), (src))))
|
||||
|
||||
#define __strcpy_a_small(dest, src, srclen) \
|
||||
# define __strcpy_a_small(dest, src, srclen) \
|
||||
(__extension__ ({ char *__dest = (dest); \
|
||||
union { \
|
||||
unsigned int __ui; \
|
||||
@ -654,16 +662,16 @@ __strcpy_g (char *__dest, const char *__src)
|
||||
}
|
||||
|
||||
|
||||
#ifdef __USE_GNU
|
||||
# define _HAVE_STRING_ARCH_stpcpy 1
|
||||
# ifdef __USE_GNU
|
||||
# define _HAVE_STRING_ARCH_stpcpy 1
|
||||
/* Copy SRC to DEST. */
|
||||
# define __stpcpy(dest, src) \
|
||||
# define __stpcpy(dest, src) \
|
||||
(__extension__ (__builtin_constant_p (src) \
|
||||
? (strlen (src) + 1 <= 8 \
|
||||
? __stpcpy_a_small ((dest), (src), strlen (src) + 1) \
|
||||
: __stpcpy_c ((dest), (src), strlen (src) + 1)) \
|
||||
: __stpcpy_g ((dest), (src))))
|
||||
# define __stpcpy_c(dest, src, srclen) \
|
||||
# define __stpcpy_c(dest, src, srclen) \
|
||||
((srclen) % 4 == 0 \
|
||||
? __mempcpy_by4 (dest, src, srclen) - 1 \
|
||||
: ((srclen) % 2 == 0 \
|
||||
@ -671,9 +679,9 @@ __strcpy_g (char *__dest, const char *__src)
|
||||
: __mempcpy_byn (dest, src, srclen) - 1))
|
||||
|
||||
/* In glibc itself we use this symbol for namespace reasons. */
|
||||
# define stpcpy(dest, src) __stpcpy ((dest), (src))
|
||||
# define stpcpy(dest, src) __stpcpy ((dest), (src))
|
||||
|
||||
# define __stpcpy_a_small(dest, src, srclen) \
|
||||
# define __stpcpy_a_small(dest, src, srclen) \
|
||||
(__extension__ ({ union { \
|
||||
unsigned int __ui; \
|
||||
unsigned short int __usi; \
|
||||
@ -826,19 +834,19 @@ __stpcpy_g (char *__dest, const char *__src)
|
||||
: "cc");
|
||||
return __tmp - 1;
|
||||
}
|
||||
#endif
|
||||
# endif
|
||||
|
||||
|
||||
/* Copy no more than N characters of SRC to DEST. */
|
||||
#define _HAVE_STRING_ARCH_strncpy 1
|
||||
#define strncpy(dest, src, n) \
|
||||
# define _HAVE_STRING_ARCH_strncpy 1
|
||||
# define strncpy(dest, src, n) \
|
||||
(__extension__ (__builtin_constant_p (src) \
|
||||
? ((strlen (src) + 1 >= ((size_t) (n)) \
|
||||
? (char *) memcpy ((char *) (dest), \
|
||||
(const char *) (src), n) \
|
||||
: __strncpy_cg ((dest), (src), strlen (src) + 1, n))) \
|
||||
: __strncpy_gg ((dest), (src), n)))
|
||||
#define __strncpy_cg(dest, src, srclen, n) \
|
||||
# define __strncpy_cg(dest, src, srclen, n) \
|
||||
(((srclen) % 4 == 0) \
|
||||
? __strncpy_by4 (dest, src, srclen, n) \
|
||||
: (((srclen) % 2 == 0) \
|
||||
@ -962,8 +970,8 @@ __strncpy_gg (char *__dest, const char *__src, size_t __n)
|
||||
|
||||
|
||||
/* Append SRC onto DEST. */
|
||||
#define _HAVE_STRING_ARCH_strcat 1
|
||||
#define strcat(dest, src) \
|
||||
# define _HAVE_STRING_ARCH_strcat 1
|
||||
# define strcat(dest, src) \
|
||||
(__extension__ (__builtin_constant_p (src) \
|
||||
? __strcat_c ((dest), (src), strlen (src) + 1) \
|
||||
: __strcat_g ((dest), (src))))
|
||||
@ -974,7 +982,7 @@ __STRING_INLINE char *__strcat_c (char *__dest, const char __src[],
|
||||
__STRING_INLINE char *
|
||||
__strcat_c (char *__dest, const char __src[], size_t __srclen)
|
||||
{
|
||||
#ifdef __i686__
|
||||
# ifdef __i686__
|
||||
register unsigned long int __d0;
|
||||
register char *__tmp;
|
||||
__asm__ __volatile__
|
||||
@ -985,7 +993,7 @@ __strcat_c (char *__dest, const char __src[], size_t __srclen)
|
||||
"m" ( *(struct { __extension__ char __x[__srclen]; } *)__src)
|
||||
: "cc");
|
||||
--__tmp;
|
||||
#else
|
||||
# else
|
||||
register char *__tmp = __dest - 1;
|
||||
__asm__ __volatile__
|
||||
("1:\n\t"
|
||||
@ -997,7 +1005,7 @@ __strcat_c (char *__dest, const char __src[], size_t __srclen)
|
||||
: "0" (__tmp),
|
||||
"m" ( *(struct { __extension__ char __x[__srclen]; } *)__src)
|
||||
: "cc");
|
||||
#endif
|
||||
# endif
|
||||
(void) memcpy (__tmp, __src, __srclen);
|
||||
return __dest;
|
||||
}
|
||||
@ -1031,8 +1039,8 @@ __strcat_g (char *__dest, const char *__src)
|
||||
|
||||
|
||||
/* Append no more than N characters from SRC onto DEST. */
|
||||
#define _HAVE_STRING_ARCH_strncat 1
|
||||
#define strncat(dest, src, n) \
|
||||
# define _HAVE_STRING_ARCH_strncat 1
|
||||
# define strncat(dest, src, n) \
|
||||
(__extension__ ({ char *__dest = (dest); \
|
||||
__builtin_constant_p (src) && __builtin_constant_p (n) \
|
||||
? (strlen (src) < ((size_t) (n)) \
|
||||
@ -1050,7 +1058,7 @@ __strncat_g (char *__dest, const char __src[], size_t __n)
|
||||
{
|
||||
register char *__tmp = __dest;
|
||||
register char __dummy;
|
||||
#ifdef __i686__
|
||||
# ifdef __i686__
|
||||
__asm__ __volatile__
|
||||
("repne; scasb\n"
|
||||
"movl %4, %3\n\t"
|
||||
@ -1068,7 +1076,7 @@ __strncat_g (char *__dest, const char __src[], size_t __n)
|
||||
: "=&a" (__dummy), "=&D" (__tmp), "=&S" (__src), "=&c" (__n)
|
||||
: "g" (__n), "0" (0), "1" (__tmp), "2" (__src), "3" (0xffffffff)
|
||||
: "memory", "cc");
|
||||
#else
|
||||
# else
|
||||
--__tmp;
|
||||
__asm__ __volatile__
|
||||
("1:\n\t"
|
||||
@ -1096,8 +1104,8 @@ __strncat_g (char *__dest, const char __src[], size_t __n)
|
||||
|
||||
|
||||
/* Compare S1 and S2. */
|
||||
#define _HAVE_STRING_ARCH_strcmp 1
|
||||
#define strcmp(s1, s2) \
|
||||
# define _HAVE_STRING_ARCH_strcmp 1
|
||||
# define strcmp(s1, s2) \
|
||||
(__extension__ (__builtin_constant_p (s1) && __builtin_constant_p (s2) \
|
||||
&& (sizeof ((s1)[0]) != 1 || strlen (s1) >= 4) \
|
||||
&& (sizeof ((s2)[0]) != 1 || strlen (s2) >= 4) \
|
||||
@ -1124,7 +1132,7 @@ __strncat_g (char *__dest, const char __src[], size_t __n)
|
||||
strlen (s2))) \
|
||||
: __strcmp_gg ((s1), (s2))))))
|
||||
|
||||
#define __strcmp_cc(s1, s2, l) \
|
||||
# define __strcmp_cc(s1, s2, l) \
|
||||
(__extension__ ({ register int __result = (s1)[0] - (s2)[0]; \
|
||||
if (l > 0 && __result == 0) \
|
||||
{ \
|
||||
@ -1138,7 +1146,7 @@ __strncat_g (char *__dest, const char __src[], size_t __n)
|
||||
} \
|
||||
__result; }))
|
||||
|
||||
#define __strcmp_cg(s1, s2, l1) \
|
||||
# define __strcmp_cg(s1, s2, l1) \
|
||||
(__extension__ ({ const unsigned char *__s2 = (s2); \
|
||||
register int __result = (s1)[0] - __s2[0]; \
|
||||
if (l1 > 0 && __result == 0) \
|
||||
@ -1153,7 +1161,7 @@ __strncat_g (char *__dest, const char __src[], size_t __n)
|
||||
} \
|
||||
__result; }))
|
||||
|
||||
#define __strcmp_gc(s1, s2, l2) \
|
||||
# define __strcmp_gc(s1, s2, l2) \
|
||||
(__extension__ ({ const unsigned char *__s1 = (s1); \
|
||||
register int __result = __s1[0] - (s2)[0]; \
|
||||
if (l2 > 0 && __result == 0) \
|
||||
@ -1200,8 +1208,8 @@ __strcmp_gg (const char *__s1, const char *__s2)
|
||||
|
||||
|
||||
/* Compare N characters of S1 and S2. */
|
||||
#define _HAVE_STRING_ARCH_strncmp 1
|
||||
#define strncmp(s1, s2, n) \
|
||||
# define _HAVE_STRING_ARCH_strncmp 1
|
||||
# define strncmp(s1, s2, n) \
|
||||
(__extension__ (__builtin_constant_p (s1) && strlen (s1) < ((size_t) (n)) \
|
||||
? strcmp ((s1), (s2)) \
|
||||
: (__builtin_constant_p (s2) && strlen (s2) < ((size_t) (n))\
|
||||
@ -1244,9 +1252,9 @@ __strncmp_g (const char *__s1, const char *__s2, size_t __n)
|
||||
|
||||
|
||||
/* Find the first occurrence of C in S. */
|
||||
#define _HAVE_STRING_ARCH_strchr 1
|
||||
#define _USE_STRING_ARCH_strchr 1
|
||||
#define strchr(s, c) \
|
||||
# define _HAVE_STRING_ARCH_strchr 1
|
||||
# define _USE_STRING_ARCH_strchr 1
|
||||
# define strchr(s, c) \
|
||||
(__extension__ (__builtin_constant_p (c) \
|
||||
? ((c) == '\0' \
|
||||
? (char *) __rawmemchr ((s), (c)) \
|
||||
@ -1304,8 +1312,8 @@ __strchr_g (const char *__s, int __c)
|
||||
|
||||
|
||||
/* Find the first occurrence of C in S or the final NUL byte. */
|
||||
#define _HAVE_STRING_ARCH_strchrnul 1
|
||||
#define __strchrnul(s, c) \
|
||||
# define _HAVE_STRING_ARCH_strchrnul 1
|
||||
# define __strchrnul(s, c) \
|
||||
(__extension__ (__builtin_constant_p (c) \
|
||||
? ((c) == '\0' \
|
||||
? (char *) __rawmemchr ((s), c) \
|
||||
@ -1360,29 +1368,29 @@ __strchrnul_g (const char *__s, int __c)
|
||||
: "cc");
|
||||
return __res;
|
||||
}
|
||||
#ifdef __USE_GNU
|
||||
# define strchrnul(s, c) __strchrnul ((s), (c))
|
||||
#endif
|
||||
# ifdef __USE_GNU
|
||||
# define strchrnul(s, c) __strchrnul ((s), (c))
|
||||
# endif
|
||||
|
||||
|
||||
#if defined __USE_BSD || defined __USE_XOPEN_EXTENDED
|
||||
# if defined __USE_BSD || defined __USE_XOPEN_EXTENDED
|
||||
/* Find the first occurrence of C in S. This is the BSD name. */
|
||||
# define _HAVE_STRING_ARCH_index 1
|
||||
# define index(s, c) \
|
||||
# define _HAVE_STRING_ARCH_index 1
|
||||
# define index(s, c) \
|
||||
(__extension__ (__builtin_constant_p (c) \
|
||||
? __strchr_c ((s), ((c) & 0xff) << 8) \
|
||||
: __strchr_g ((s), (c))))
|
||||
#endif
|
||||
# endif
|
||||
|
||||
|
||||
/* Find the last occurrence of C in S. */
|
||||
#define _HAVE_STRING_ARCH_strrchr 1
|
||||
#define strrchr(s, c) \
|
||||
# define _HAVE_STRING_ARCH_strrchr 1
|
||||
# define strrchr(s, c) \
|
||||
(__extension__ (__builtin_constant_p (c) \
|
||||
? __strrchr_c ((s), ((c) & 0xff) << 8) \
|
||||
: __strrchr_g ((s), (c))))
|
||||
|
||||
#ifdef __i686__
|
||||
# ifdef __i686__
|
||||
__STRING_INLINE char *__strrchr_c (const char *__s, int __c);
|
||||
|
||||
__STRING_INLINE char *
|
||||
@ -1427,7 +1435,7 @@ __strrchr_g (const char *__s, int __c)
|
||||
: "cc");
|
||||
return __res - 1;
|
||||
}
|
||||
#else
|
||||
# else
|
||||
__STRING_INLINE char *__strrchr_c (const char *__s, int __c);
|
||||
|
||||
__STRING_INLINE char *
|
||||
@ -1476,23 +1484,23 @@ __strrchr_g (const char *__s, int __c)
|
||||
: "cc");
|
||||
return __res;
|
||||
}
|
||||
#endif
|
||||
# endif
|
||||
|
||||
|
||||
#if defined __USE_BSD || defined __USE_XOPEN_EXTENDED
|
||||
# if defined __USE_BSD || defined __USE_XOPEN_EXTENDED
|
||||
/* Find the last occurrence of C in S. This is the BSD name. */
|
||||
# define _HAVE_STRING_ARCH_rindex 1
|
||||
# define rindex(s, c) \
|
||||
# define _HAVE_STRING_ARCH_rindex 1
|
||||
# define rindex(s, c) \
|
||||
(__extension__ (__builtin_constant_p (c) \
|
||||
? __strrchr_c ((s), ((c) & 0xff) << 8) \
|
||||
: __strrchr_g ((s), (c))))
|
||||
#endif
|
||||
# endif
|
||||
|
||||
|
||||
/* Return the length of the initial segment of S which
|
||||
consists entirely of characters not in REJECT. */
|
||||
#define _HAVE_STRING_ARCH_strcspn 1
|
||||
#define strcspn(s, reject) \
|
||||
# define _HAVE_STRING_ARCH_strcspn 1
|
||||
# define strcspn(s, reject) \
|
||||
(__extension__ (__builtin_constant_p (reject) && sizeof ((reject)[0]) == 1 \
|
||||
? ((reject)[0] == '\0' \
|
||||
? strlen (s) \
|
||||
@ -1503,7 +1511,7 @@ __strrchr_g (const char *__s, int __c)
|
||||
|
||||
__STRING_INLINE size_t __strcspn_c1 (const char *__s, int __reject);
|
||||
|
||||
#ifndef _FORCE_INLINES
|
||||
# ifndef _FORCE_INLINES
|
||||
__STRING_INLINE size_t
|
||||
__strcspn_c1 (const char *__s, int __reject)
|
||||
{
|
||||
@ -1524,7 +1532,7 @@ __strcspn_c1 (const char *__s, int __reject)
|
||||
: "cc");
|
||||
return (__res - 1) - __s;
|
||||
}
|
||||
#endif
|
||||
# endif
|
||||
|
||||
__STRING_INLINE size_t __strcspn_cg (const char *__s, const char __reject[],
|
||||
size_t __reject_len);
|
||||
@ -1552,7 +1560,7 @@ __strcspn_cg (const char *__s, const char __reject[], size_t __reject_len)
|
||||
}
|
||||
|
||||
__STRING_INLINE size_t __strcspn_g (const char *__s, const char *__reject);
|
||||
#ifdef __PIC__
|
||||
# ifdef __PIC__
|
||||
|
||||
__STRING_INLINE size_t
|
||||
__strcspn_g (const char *__s, const char *__reject)
|
||||
@ -1581,7 +1589,7 @@ __strcspn_g (const char *__s, const char *__reject)
|
||||
: "memory", "cc");
|
||||
return (__res - 1) - __s;
|
||||
}
|
||||
#else
|
||||
# else
|
||||
__STRING_INLINE size_t
|
||||
__strcspn_g (const char *__s, const char *__reject)
|
||||
{
|
||||
@ -1607,13 +1615,13 @@ __strcspn_g (const char *__s, const char *__reject)
|
||||
: "memory", "cc");
|
||||
return (__res - 1) - __s;
|
||||
}
|
||||
#endif
|
||||
# endif
|
||||
|
||||
|
||||
/* Return the length of the initial segment of S which
|
||||
consists entirely of characters in ACCEPT. */
|
||||
#define _HAVE_STRING_ARCH_strspn 1
|
||||
#define strspn(s, accept) \
|
||||
# define _HAVE_STRING_ARCH_strspn 1
|
||||
# define strspn(s, accept) \
|
||||
(__extension__ (__builtin_constant_p (accept) && sizeof ((accept)[0]) == 1 \
|
||||
? ((accept)[0] == '\0' \
|
||||
? ((void) (s), 0) \
|
||||
@ -1622,7 +1630,7 @@ __strcspn_g (const char *__s, const char *__reject)
|
||||
: __strspn_cg ((s), (accept), strlen (accept)))) \
|
||||
: __strspn_g ((s), (accept))))
|
||||
|
||||
#ifndef _FORCE_INLINES
|
||||
# ifndef _FORCE_INLINES
|
||||
__STRING_INLINE size_t __strspn_c1 (const char *__s, int __accept);
|
||||
|
||||
__STRING_INLINE size_t
|
||||
@ -1643,7 +1651,7 @@ __strspn_c1 (const char *__s, int __accept)
|
||||
: "cc");
|
||||
return (__res - 1) - __s;
|
||||
}
|
||||
#endif
|
||||
# endif
|
||||
|
||||
__STRING_INLINE size_t __strspn_cg (const char *__s, const char __accept[],
|
||||
size_t __accept_len);
|
||||
@ -1675,7 +1683,7 @@ __strspn_cg (const char *__s, const char __accept[], size_t __accept_len)
|
||||
}
|
||||
|
||||
__STRING_INLINE size_t __strspn_g (const char *__s, const char *__accept);
|
||||
#ifdef __PIC__
|
||||
# ifdef __PIC__
|
||||
|
||||
__STRING_INLINE size_t
|
||||
__strspn_g (const char *__s, const char *__accept)
|
||||
@ -1703,7 +1711,7 @@ __strspn_g (const char *__s, const char *__accept)
|
||||
: "memory", "cc");
|
||||
return (__res - 1) - __s;
|
||||
}
|
||||
#else
|
||||
# else
|
||||
__STRING_INLINE size_t
|
||||
__strspn_g (const char *__s, const char *__accept)
|
||||
{
|
||||
@ -1728,12 +1736,12 @@ __strspn_g (const char *__s, const char *__accept)
|
||||
: "memory", "cc");
|
||||
return (__res - 1) - __s;
|
||||
}
|
||||
#endif
|
||||
# endif
|
||||
|
||||
|
||||
/* Find the first occurrence in S of any character in ACCEPT. */
|
||||
#define _HAVE_STRING_ARCH_strpbrk 1
|
||||
#define strpbrk(s, accept) \
|
||||
# define _HAVE_STRING_ARCH_strpbrk 1
|
||||
# define strpbrk(s, accept) \
|
||||
(__extension__ (__builtin_constant_p (accept) && sizeof ((accept)[0]) == 1 \
|
||||
? ((accept)[0] == '\0' \
|
||||
? ((void) (s), (char *) 0) \
|
||||
@ -1772,7 +1780,7 @@ __strpbrk_cg (const char *__s, const char __accept[], size_t __accept_len)
|
||||
}
|
||||
|
||||
__STRING_INLINE char *__strpbrk_g (const char *__s, const char *__accept);
|
||||
#ifdef __PIC__
|
||||
# ifdef __PIC__
|
||||
|
||||
__STRING_INLINE char *
|
||||
__strpbrk_g (const char *__s, const char *__accept)
|
||||
@ -1805,7 +1813,7 @@ __strpbrk_g (const char *__s, const char *__accept)
|
||||
: "memory", "cc");
|
||||
return __res;
|
||||
}
|
||||
#else
|
||||
# else
|
||||
__STRING_INLINE char *
|
||||
__strpbrk_g (const char *__s, const char *__accept)
|
||||
{
|
||||
@ -1835,12 +1843,12 @@ __strpbrk_g (const char *__s, const char *__accept)
|
||||
: "memory", "cc");
|
||||
return __res;
|
||||
}
|
||||
#endif
|
||||
# endif
|
||||
|
||||
|
||||
/* Find the first occurrence of NEEDLE in HAYSTACK. */
|
||||
#define _HAVE_STRING_ARCH_strstr 1
|
||||
#define strstr(haystack, needle) \
|
||||
# define _HAVE_STRING_ARCH_strstr 1
|
||||
# define strstr(haystack, needle) \
|
||||
(__extension__ (__builtin_constant_p (needle) && sizeof ((needle)[0]) == 1 \
|
||||
? ((needle)[0] == '\0' \
|
||||
? (haystack) \
|
||||
@ -1883,7 +1891,7 @@ __strstr_cg (const char *__haystack, const char __needle[],
|
||||
|
||||
__STRING_INLINE char *__strstr_g (const char *__haystack,
|
||||
const char *__needle);
|
||||
#ifdef __PIC__
|
||||
# ifdef __PIC__
|
||||
|
||||
__STRING_INLINE char *
|
||||
__strstr_g (const char *__haystack, const char *__needle)
|
||||
@ -1915,7 +1923,7 @@ __strstr_g (const char *__haystack, const char *__needle)
|
||||
: "memory", "cc");
|
||||
return __res;
|
||||
}
|
||||
#else
|
||||
# else
|
||||
__STRING_INLINE char *
|
||||
__strstr_g (const char *__haystack, const char *__needle)
|
||||
{
|
||||
@ -1944,32 +1952,34 @@ __strstr_g (const char *__haystack, const char *__needle)
|
||||
: "memory", "cc");
|
||||
return __res;
|
||||
}
|
||||
#endif
|
||||
# endif
|
||||
|
||||
|
||||
/* Bit find functions. We define only the i686 version since for the other
|
||||
processors gcc generates good code. */
|
||||
#if defined __USE_BSD || defined __USE_XOPEN_EXTENDED
|
||||
# ifdef __i686__
|
||||
# define _HAVE_STRING_ARCH_ffs 1
|
||||
# define ffs(word) (__builtin_constant_p (word) \
|
||||
? __builtin_ffs (word) \
|
||||
: ({ int __cnt, __tmp; \
|
||||
__asm__ __volatile__ \
|
||||
("bsfl %2,%0\n\t" \
|
||||
"cmovel %1,%0" \
|
||||
: "=&r" (__cnt), "=r" (__tmp) \
|
||||
: "rm" (word), "1" (-1)); \
|
||||
__cnt + 1; }))
|
||||
# if defined __USE_BSD || defined __USE_XOPEN_EXTENDED
|
||||
# ifdef __i686__
|
||||
# define _HAVE_STRING_ARCH_ffs 1
|
||||
# define ffs(word) (__builtin_constant_p (word) \
|
||||
? __builtin_ffs (word) \
|
||||
: ({ int __cnt, __tmp; \
|
||||
__asm__ __volatile__ \
|
||||
("bsfl %2,%0\n\t" \
|
||||
"cmovel %1,%0" \
|
||||
: "=&r" (__cnt), "=r" (__tmp) \
|
||||
: "rm" (word), "1" (-1)); \
|
||||
__cnt + 1; }))
|
||||
|
||||
# ifndef ffsl
|
||||
# define ffsl(word) ffs(word)
|
||||
# endif
|
||||
# endif /* i686 */
|
||||
#endif /* BSD || X/Open */
|
||||
# ifndef ffsl
|
||||
# define ffsl(word) ffs(word)
|
||||
# endif
|
||||
# endif /* i686 */
|
||||
# endif /* BSD || X/Open */
|
||||
|
||||
# ifndef _FORCE_INLINES
|
||||
# undef __STRING_INLINE
|
||||
# endif
|
||||
|
||||
# endif /* use string inlines && GNU CC */
|
||||
|
||||
#ifndef _FORCE_INLINES
|
||||
# undef __STRING_INLINE
|
||||
#endif
|
||||
|
||||
#endif /* use string inlines && GNU CC */
|
||||
|
Loading…
Reference in New Issue
Block a user