187e239b9SJérôme Duval/* Optimized, inlined string functions.  i386 version.
287e239b9SJérôme Duval   Copyright (C) 1997,1998,1999,2000,2003 Free Software Foundation, Inc.
387e239b9SJérôme Duval   This file is part of the GNU C Library.
487e239b9SJérôme Duval
587e239b9SJérôme Duval   The GNU C Library is free software; you can redistribute it and/or
687e239b9SJérôme Duval   modify it under the terms of the GNU Lesser General Public
787e239b9SJérôme Duval   License as published by the Free Software Foundation; either
887e239b9SJérôme Duval   version 2.1 of the License, or (at your option) any later version.
987e239b9SJérôme Duval
1087e239b9SJérôme Duval   The GNU C Library is distributed in the hope that it will be useful,
1187e239b9SJérôme Duval   but WITHOUT ANY WARRANTY; without even the implied warranty of
1287e239b9SJérôme Duval   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
1387e239b9SJérôme Duval   Lesser General Public License for more details.
1487e239b9SJérôme Duval
1587e239b9SJérôme Duval   You should have received a copy of the GNU Lesser General Public
1687e239b9SJérôme Duval   License along with the GNU C Library; if not, write to the Free
1787e239b9SJérôme Duval   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
1887e239b9SJérôme Duval   02111-1307 USA.  */
1987e239b9SJérôme Duval
2087e239b9SJérôme Duval#ifndef _STRING_H
2187e239b9SJérôme Duval# error "Never use <bits/string.h> directly; include <string.h> instead."
2287e239b9SJérôme Duval#endif
2387e239b9SJérôme Duval
2487e239b9SJérôme Duval/* The ix86 processors can access unaligned multi-byte variables.  */
2587e239b9SJérôme Duval#define _STRING_ARCH_unaligned	1
2687e239b9SJérôme Duval
2787e239b9SJérôme Duval
2887e239b9SJérôme Duval/* We only provide optimizations if the user selects them and if
2987e239b9SJérôme Duval   GNU CC is used.  */
3087e239b9SJérôme Duval#if !defined __NO_STRING_INLINES && defined __USE_STRING_INLINES \
3187e239b9SJérôme Duval    && defined __GNUC__ && __GNUC__ >= 2 && !__BOUNDED_POINTERS__
3287e239b9SJérôme Duval
3387e239b9SJérôme Duval#ifndef __STRING_INLINE
3487e239b9SJérôme Duval# ifdef __cplusplus
3587e239b9SJérôme Duval#  define __STRING_INLINE inline
3687e239b9SJérôme Duval# else
3787e239b9SJérôme Duval#  define __STRING_INLINE extern __inline
3887e239b9SJérôme Duval# endif
3987e239b9SJérôme Duval#endif
4087e239b9SJérôme Duval
4187e239b9SJérôme Duval
4287e239b9SJérôme Duval/* Copy N bytes of SRC to DEST.  */
4387e239b9SJérôme Duval#define _HAVE_STRING_ARCH_memcpy 1
4487e239b9SJérôme Duval#define memcpy(dest, src, n) \
4587e239b9SJérôme Duval  (__extension__ (__builtin_constant_p (n)				      \
4687e239b9SJérôme Duval		  ? __memcpy_c ((dest), (src), (n))			      \
4787e239b9SJérôme Duval		  : memcpy ((dest), (src), (n))))
4887e239b9SJérôme Duval/* This looks horribly ugly, but the compiler can optimize it totally,
4987e239b9SJérôme Duval   as the count is constant.  */
5087e239b9SJérôme Duval__STRING_INLINE void *__memcpy_c (void *__dest, __const void *__src,
5187e239b9SJérôme Duval				  size_t __n);
5287e239b9SJérôme Duval
5387e239b9SJérôme Duval__STRING_INLINE void *
5487e239b9SJérôme Duval__memcpy_c (void *__dest, __const void *__src, size_t __n)
5587e239b9SJérôme Duval{
5687e239b9SJérôme Duval  register unsigned long int __d0, __d1, __d2;
5787e239b9SJérôme Duval  union {
5887e239b9SJérôme Duval    unsigned int __ui;
5987e239b9SJérôme Duval    unsigned short int __usi;
6087e239b9SJérôme Duval    unsigned char __uc;
6187e239b9SJérôme Duval  } *__u = __dest;
6287e239b9SJérôme Duval  switch (__n)
6387e239b9SJérôme Duval    {
6487e239b9SJérôme Duval    case 0:
6587e239b9SJérôme Duval      return __dest;
6687e239b9SJérôme Duval    case 1:
6787e239b9SJérôme Duval      __u->__uc = *(const unsigned char *) __src;
6887e239b9SJérôme Duval      return __dest;
6987e239b9SJérôme Duval    case 2:
7087e239b9SJérôme Duval      __u->__usi = *(const unsigned short int *) __src;
7187e239b9SJérôme Duval      return __dest;
7287e239b9SJérôme Duval    case 3:
7387e239b9SJérôme Duval      __u->__usi = *(const unsigned short int *) __src;
7487e239b9SJérôme Duval      __u = (void *) __u + 2;
7587e239b9SJérôme Duval      __u->__uc = *(2 + (const unsigned char *) __src);
7687e239b9SJérôme Duval      return __dest;
7787e239b9SJérôme Duval    case 4:
7887e239b9SJérôme Duval      __u->__ui = *(const unsigned int *) __src;
7987e239b9SJérôme Duval      return __dest;
8087e239b9SJérôme Duval    case 6:
8187e239b9SJérôme Duval      __u->__ui = *(const unsigned int *) __src;
8287e239b9SJérôme Duval      __u = (void *) __u + 4;
8387e239b9SJérôme Duval      __u->__usi = *(2 + (const unsigned short int *) __src);
8487e239b9SJérôme Duval      return __dest;
8587e239b9SJérôme Duval    case 8:
8687e239b9SJérôme Duval      __u->__ui = *(const unsigned int *) __src;
8787e239b9SJérôme Duval      __u = (void *) __u + 4;
8887e239b9SJérôme Duval      __u->__ui = *(1 + (const unsigned int *) __src);
8987e239b9SJérôme Duval      return __dest;
9087e239b9SJérôme Duval    case 12:
9187e239b9SJérôme Duval      __u->__ui = *(const unsigned int *) __src;
9287e239b9SJérôme Duval      __u = (void *) __u + 4;
9387e239b9SJérôme Duval      __u->__ui = *(1 + (const unsigned int *) __src);
9487e239b9SJérôme Duval      __u = (void *) __u + 4;
9587e239b9SJérôme Duval      __u->__ui = *(2 + (const unsigned int *) __src);
9687e239b9SJérôme Duval      return __dest;
9787e239b9SJérôme Duval    case 16:
9887e239b9SJérôme Duval      __u->__ui = *(const unsigned int *) __src;
9987e239b9SJérôme Duval      __u = (void *) __u + 4;
10087e239b9SJérôme Duval      __u->__ui = *(1 + (const unsigned int *) __src);
10187e239b9SJérôme Duval      __u = (void *) __u + 4;
10287e239b9SJérôme Duval      __u->__ui = *(2 + (const unsigned int *) __src);
10387e239b9SJérôme Duval      __u = (void *) __u + 4;
10487e239b9SJérôme Duval      __u->__ui = *(3 + (const unsigned int *) __src);
10587e239b9SJérôme Duval      return __dest;
10687e239b9SJérôme Duval    case 20:
10787e239b9SJérôme Duval      __u->__ui = *(const unsigned int *) __src;
10887e239b9SJérôme Duval      __u = (void *) __u + 4;
10987e239b9SJérôme Duval      __u->__ui = *(1 + (const unsigned int *) __src);
11087e239b9SJérôme Duval      __u = (void *) __u + 4;
11187e239b9SJérôme Duval      __u->__ui = *(2 + (const unsigned int *) __src);
11287e239b9SJérôme Duval      __u = (void *) __u + 4;
11387e239b9SJérôme Duval      __u->__ui = *(3 + (const unsigned int *) __src);
11487e239b9SJérôme Duval      __u = (void *) __u + 4;
11587e239b9SJérôme Duval      __u->__ui = *(4 + (const unsigned int *) __src);
11687e239b9SJérôme Duval      return __dest;
11787e239b9SJérôme Duval    }
11887e239b9SJérôme Duval#define __COMMON_CODE(x) \
11987e239b9SJérôme Duval  __asm__ __volatile__							      \
12087e239b9SJérôme Duval    ("cld\n\t"								      \
12187e239b9SJérôme Duval     "rep; movsl"							      \
12287e239b9SJérôme Duval     x									      \
12387e239b9SJérôme Duval     : "=&c" (__d0), "=&D" (__d1), "=&S" (__d2)				      \
12487e239b9SJérôme Duval     : "0" (__n / 4), "1" (&__u->__uc), "2" (__src)			      \
12587e239b9SJérôme Duval     : "memory");
12687e239b9SJérôme Duval
12787e239b9SJérôme Duval  switch (__n % 4)
12887e239b9SJérôme Duval    {
12987e239b9SJérôme Duval    case 0:
13087e239b9SJérôme Duval      __COMMON_CODE ("");
13187e239b9SJérôme Duval      break;
13287e239b9SJérôme Duval    case 1:
13387e239b9SJérôme Duval      __COMMON_CODE ("\n\tmovsb");
13487e239b9SJérôme Duval      break;
13587e239b9SJérôme Duval    case 2:
13687e239b9SJérôme Duval      __COMMON_CODE ("\n\tmovsw");
13787e239b9SJérôme Duval      break;
13887e239b9SJérôme Duval    case 3:
13987e239b9SJérôme Duval      __COMMON_CODE ("\n\tmovsw\n\tmovsb");
14087e239b9SJérôme Duval      break;
14187e239b9SJérôme Duval  }
14287e239b9SJérôme Duval  return __dest;
14387e239b9SJérôme Duval#undef __COMMON_CODE
14487e239b9SJérôme Duval}
14587e239b9SJérôme Duval
14687e239b9SJérôme Duval
14787e239b9SJérôme Duval/* Copy N bytes of SRC to DEST, guaranteeing
14887e239b9SJérôme Duval   correct behavior for overlapping strings.  */
14987e239b9SJérôme Duval#define _HAVE_STRING_ARCH_memmove 1
15087e239b9SJérôme Duval#ifndef _FORCE_INLINES
15187e239b9SJérôme Duval__STRING_INLINE void *
15287e239b9SJérôme Duvalmemmove (void *__dest, __const void *__src, size_t __n)
15387e239b9SJérôme Duval{
15487e239b9SJérôme Duval  register unsigned long int __d0, __d1, __d2;
15587e239b9SJérôme Duval  if (__dest < __src)
15687e239b9SJérôme Duval    __asm__ __volatile__
15787e239b9SJérôme Duval      ("cld\n\t"
15887e239b9SJérôme Duval       "rep\n\t"
15987e239b9SJérôme Duval       "movsb"
16087e239b9SJérôme Duval       : "=&c" (__d0), "=&S" (__d1), "=&D" (__d2)
16187e239b9SJérôme Duval       : "0" (__n), "1" (__src), "2" (__dest)
16287e239b9SJérôme Duval       : "memory");
16387e239b9SJérôme Duval  else
16487e239b9SJérôme Duval    __asm__ __volatile__
16587e239b9SJérôme Duval      ("std\n\t"
16687e239b9SJérôme Duval       "rep\n\t"
16787e239b9SJérôme Duval       "movsb\n\t"
16887e239b9SJérôme Duval       "cld"
16987e239b9SJérôme Duval       : "=&c" (__d0), "=&S" (__d1), "=&D" (__d2)
17087e239b9SJérôme Duval       : "0" (__n), "1" (__n - 1 + (const char *) __src),
17187e239b9SJérôme Duval	 "2" (__n - 1 + (char *) __dest)
17287e239b9SJérôme Duval       : "memory");
17387e239b9SJérôme Duval  return __dest;
17487e239b9SJérôme Duval}
17587e239b9SJérôme Duval#endif
17687e239b9SJérôme Duval
17787e239b9SJérôme Duval/* Set N bytes of S to C.  */
17887e239b9SJérôme Duval#define _HAVE_STRING_ARCH_memset 1
17987e239b9SJérôme Duval#define _USE_STRING_ARCH_memset 1
18087e239b9SJérôme Duval#define memset(s, c, n) \
18187e239b9SJérôme Duval  (__extension__ (__builtin_constant_p (c)				      \
18287e239b9SJérôme Duval		  ? (__builtin_constant_p (n)				      \
18387e239b9SJérôme Duval		     ? __memset_cc (s, 0x01010101UL * (unsigned char) (c), n) \
18487e239b9SJérôme Duval		     : __memset_cg (s, 0x01010101UL * (unsigned char) (c), n))\
18587e239b9SJérôme Duval		  : __memset_gg (s, c, n)))
18687e239b9SJérôme Duval
18787e239b9SJérôme Duval__STRING_INLINE void *__memset_cc (void *__s, unsigned long int __pattern,
18887e239b9SJérôme Duval				   size_t __n);
18987e239b9SJérôme Duval
19087e239b9SJérôme Duval__STRING_INLINE void *
19187e239b9SJérôme Duval__memset_cc (void *__s, unsigned long int __pattern, size_t __n)
19287e239b9SJérôme Duval{
19387e239b9SJérôme Duval  register unsigned long int __d0, __d1;
19487e239b9SJérôme Duval  union {
19587e239b9SJérôme Duval    unsigned int __ui;
19687e239b9SJérôme Duval    unsigned short int __usi;
19787e239b9SJérôme Duval    unsigned char __uc;
19887e239b9SJérôme Duval  } *__u = __s;
19987e239b9SJérôme Duval  switch (__n)
20087e239b9SJérôme Duval    {
20187e239b9SJérôme Duval    case 0:
20287e239b9SJérôme Duval      return __s;
20387e239b9SJérôme Duval    case 1:
20487e239b9SJérôme Duval      __u->__uc = __pattern;
20587e239b9SJérôme Duval      return __s;
20687e239b9SJérôme Duval    case 2:
20787e239b9SJérôme Duval      __u->__usi = __pattern;
20887e239b9SJérôme Duval      return __s;
20987e239b9SJérôme Duval    case 3:
21087e239b9SJérôme Duval      __u->__usi = __pattern;
21187e239b9SJérôme Duval      __u = __extension__ ((void *) __u + 2);
21287e239b9SJérôme Duval      __u->__uc = __pattern;
21387e239b9SJérôme Duval      return __s;
21487e239b9SJérôme Duval    case 4:
21587e239b9SJérôme Duval      __u->__ui = __pattern;
21687e239b9SJérôme Duval      return __s;
21787e239b9SJérôme Duval	}
21887e239b9SJérôme Duval#define __COMMON_CODE(x) \
21987e239b9SJérôme Duval  __asm__ __volatile__							      \
22087e239b9SJérôme Duval    ("cld\n\t"								      \
22187e239b9SJérôme Duval     "rep; stosl"							      \
22287e239b9SJérôme Duval     x									      \
22387e239b9SJérôme Duval     : "=&c" (__d0), "=&D" (__d1)					      \
22487e239b9SJérôme Duval     : "a" (__pattern), "0" (__n / 4), "1" (&__u->__uc)			      \
22587e239b9SJérôme Duval     : "memory")
22687e239b9SJérôme Duval
22787e239b9SJérôme Duval  switch (__n % 4)
22887e239b9SJérôme Duval    {
22987e239b9SJérôme Duval    case 0:
23087e239b9SJérôme Duval      __COMMON_CODE ("");
23187e239b9SJérôme Duval      break;
23287e239b9SJérôme Duval    case 1:
23387e239b9SJérôme Duval      __COMMON_CODE ("\n\tstosb");
23487e239b9SJérôme Duval      break;
23587e239b9SJérôme Duval    case 2:
23687e239b9SJérôme Duval      __COMMON_CODE ("\n\tstosw");
23787e239b9SJérôme Duval      break;
23887e239b9SJérôme Duval    case 3:
23987e239b9SJérôme Duval      __COMMON_CODE ("\n\tstosw\n\tstosb");
24087e239b9SJérôme Duval      break;
24187e239b9SJérôme Duval    }
24287e239b9SJérôme Duval  return __s;
24387e239b9SJérôme Duval#undef __COMMON_CODE
24487e239b9SJérôme Duval}
24587e239b9SJérôme Duval
24687e239b9SJérôme Duval__STRING_INLINE void *__memset_cg (void *__s, unsigned long __c, size_t __n);
24787e239b9SJérôme Duval
24887e239b9SJérôme Duval__STRING_INLINE void *
24987e239b9SJérôme Duval__memset_cg (void *__s, unsigned long __c, size_t __n)
25087e239b9SJérôme Duval{
25187e239b9SJérôme Duval  register unsigned long int __d0, __d1;
25287e239b9SJérôme Duval  __asm__ __volatile__
25387e239b9SJérôme Duval    ("cld\n\t"
25487e239b9SJérôme Duval     "rep; stosl\n\t"
25587e239b9SJérôme Duval     "testb	$2,%b3\n\t"
25687e239b9SJérôme Duval     "je	1f\n\t"
25787e239b9SJérôme Duval     "stosw\n"
25887e239b9SJérôme Duval     "1:\n\t"
25987e239b9SJérôme Duval     "testb	$1,%b3\n\t"
26087e239b9SJérôme Duval     "je	2f\n\t"
26187e239b9SJérôme Duval     "stosb\n"
26287e239b9SJérôme Duval     "2:"
26387e239b9SJérôme Duval     : "=&c" (__d0), "=&D" (__d1)
26487e239b9SJérôme Duval     : "a" (__c), "q" (__n), "0" (__n / 4), "1" (__s)
26587e239b9SJérôme Duval     : "memory");
26687e239b9SJérôme Duval  return __s;
26787e239b9SJérôme Duval}
26887e239b9SJérôme Duval
26987e239b9SJérôme Duval__STRING_INLINE void *__memset_gg (void *__s, char __c, size_t __n);
27087e239b9SJérôme Duval
27187e239b9SJérôme Duval__STRING_INLINE void *
27287e239b9SJérôme Duval__memset_gg (void *__s, char __c, size_t __n)
27387e239b9SJérôme Duval{
27487e239b9SJérôme Duval  register unsigned long int __d0, __d1;
27587e239b9SJérôme Duval  __asm__ __volatile__
27687e239b9SJérôme Duval    ("cld\n\t"
27787e239b9SJérôme Duval     "rep; stosb"
27887e239b9SJérôme Duval     : "=&D" (__d0), "=&c" (__d1)
27987e239b9SJérôme Duval     : "a" (__c), "0" (__s), "1" (__n)
28087e239b9SJérôme Duval     : "memory");
28187e239b9SJérôme Duval  return __s;
28287e239b9SJérôme Duval}
28387e239b9SJérôme Duval
28487e239b9SJérôme Duval
28587e239b9SJérôme Duval
28687e239b9SJérôme Duval
28787e239b9SJérôme Duval/* Search N bytes of S for C.  */
28887e239b9SJérôme Duval#define _HAVE_STRING_ARCH_memchr 1
28987e239b9SJérôme Duval#ifndef _FORCE_INLINES
29087e239b9SJérôme Duval__STRING_INLINE void *
29187e239b9SJérôme Duvalmemchr (__const void *__s, int __c, size_t __n)
29287e239b9SJérôme Duval{
29387e239b9SJérôme Duval  register unsigned long int __d0;
29487e239b9SJérôme Duval  register void *__res;
29587e239b9SJérôme Duval  if (__n == 0)
29687e239b9SJérôme Duval    return NULL;
29787e239b9SJérôme Duval  __asm__ __volatile__
29887e239b9SJérôme Duval    ("cld\n\t"
29987e239b9SJérôme Duval     "repne; scasb\n\t"
30087e239b9SJérôme Duval     "je 1f\n\t"
30187e239b9SJérôme Duval     "movl $1,%0\n"
30287e239b9SJérôme Duval     "1:"
30387e239b9SJérôme Duval     : "=D" (__res), "=&c" (__d0)
30487e239b9SJérôme Duval     : "a" (__c), "0" (__s), "1" (__n),
30587e239b9SJérôme Duval       "m" ( *(struct { __extension__ char __x[__n]; } *)__s)
30687e239b9SJérôme Duval     : "cc");
30787e239b9SJérôme Duval  return __res - 1;
30887e239b9SJérôme Duval}
30987e239b9SJérôme Duval#endif
31087e239b9SJérôme Duval
31187e239b9SJérôme Duval#define _HAVE_STRING_ARCH_memrchr 1
31287e239b9SJérôme Duval#ifndef _FORCE_INLINES
31387e239b9SJérôme Duval__STRING_INLINE void *
31487e239b9SJérôme Duval__memrchr (__const void *__s, int __c, size_t __n)
31587e239b9SJérôme Duval{
31687e239b9SJérôme Duval  register unsigned long int __d0;
31787e239b9SJérôme Duval  register void *__res;
31887e239b9SJérôme Duval  if (__n == 0)
31987e239b9SJérôme Duval    return NULL;
32087e239b9SJérôme Duval  __asm__ __volatile__
32187e239b9SJérôme Duval    ("std\n\t"
32287e239b9SJérôme Duval     "repne; scasb\n\t"
32387e239b9SJérôme Duval     "je 1f\n\t"
32487e239b9SJérôme Duval     "orl $-1,%0\n"
32587e239b9SJérôme Duval     "1:\tcld\n\t"
32687e239b9SJérôme Duval     "incl %0"
32787e239b9SJérôme Duval     : "=D" (__res), "=&c" (__d0)
32887e239b9SJérôme Duval     : "a" (__c), "0" (__s + __n - 1), "1" (__n),
32987e239b9SJérôme Duval       "m" ( *(struct { __extension__ char __x[__n]; } *)__s)
33087e239b9SJérôme Duval     : "cc");
33187e239b9SJérôme Duval  return __res;
33287e239b9SJérôme Duval}
33387e239b9SJérôme Duval# ifdef __USE_GNU
33487e239b9SJérôme Duval#  define memrchr(s, c, n) __memrchr (s, c, n)
33587e239b9SJérôme Duval# endif
33687e239b9SJérôme Duval#endif
33787e239b9SJérôme Duval
33887e239b9SJérôme Duval/* Return the length of S.  */
33987e239b9SJérôme Duval#define _HAVE_STRING_ARCH_strlen 1
34087e239b9SJérôme Duval#ifndef _FORCE_INLINES
34187e239b9SJérôme Duval__STRING_INLINE size_t
34287e239b9SJérôme Duvalstrlen (__const char *__str)
34387e239b9SJérôme Duval{
34487e239b9SJérôme Duval  register unsigned long int __d0;
34587e239b9SJérôme Duval  register size_t __res;
34687e239b9SJérôme Duval  __asm__ __volatile__
34787e239b9SJérôme Duval    ("cld\n\t"
34887e239b9SJérôme Duval     "repne; scasb\n\t"
34987e239b9SJérôme Duval     "notl %0"
35087e239b9SJérôme Duval     : "=c" (__res), "=&D" (__d0)
35187e239b9SJérôme Duval     : "1" (__str), "a" (0), "0" (0xffffffff),
35287e239b9SJérôme Duval       "m" ( *(struct { char __x[0xfffffff]; } *)__str)
35387e239b9SJérôme Duval     : "cc");
35487e239b9SJérôme Duval  return __res - 1;
35587e239b9SJérôme Duval}
35687e239b9SJérôme Duval#endif
35787e239b9SJérôme Duval
35887e239b9SJérôme Duval/* Copy SRC to DEST.  */
35987e239b9SJérôme Duval#define _HAVE_STRING_ARCH_strcpy 1
36087e239b9SJérôme Duval#ifndef _FORCE_INLINES
36187e239b9SJérôme Duval__STRING_INLINE char *
36287e239b9SJérôme Duvalstrcpy (char *__dest, __const char *__src)
36387e239b9SJérôme Duval{
36487e239b9SJérôme Duval  register unsigned long int __d0, __d1;
36587e239b9SJérôme Duval  __asm__ __volatile__
36687e239b9SJérôme Duval    ("cld\n"
36787e239b9SJérôme Duval     "1:\n\t"
36887e239b9SJérôme Duval     "lodsb\n\t"
36987e239b9SJérôme Duval     "stosb\n\t"
37087e239b9SJérôme Duval     "testb	%%al,%%al\n\t"
37187e239b9SJérôme Duval     "jne	1b"
37287e239b9SJérôme Duval     : "=&S" (__d0), "=&D" (__d1)
37387e239b9SJérôme Duval     : "0" (__src), "1" (__dest)
37487e239b9SJérôme Duval     : "ax", "memory", "cc");
37587e239b9SJérôme Duval  return __dest;
37687e239b9SJérôme Duval}
37787e239b9SJérôme Duval#endif
37887e239b9SJérôme Duval
37987e239b9SJérôme Duval/* Copy no more than N characters of SRC to DEST.  */
38087e239b9SJérôme Duval#define _HAVE_STRING_ARCH_strncpy 1
38187e239b9SJérôme Duval#ifndef _FORCE_INLINES
38287e239b9SJérôme Duval__STRING_INLINE char *
38387e239b9SJérôme Duvalstrncpy (char *__dest, __const char *__src, size_t __n)
38487e239b9SJérôme Duval{
38587e239b9SJérôme Duval  register unsigned long int __d0, __d1, __d2;
38687e239b9SJérôme Duval  __asm__ __volatile__
38787e239b9SJérôme Duval    ("cld\n"
38887e239b9SJérôme Duval     "1:\n\t"
38987e239b9SJérôme Duval     "decl	%2\n\t"
39087e239b9SJérôme Duval     "js	2f\n\t"
39187e239b9SJérôme Duval     "lodsb\n\t"
39287e239b9SJérôme Duval     "stosb\n\t"
39387e239b9SJérôme Duval     "testb	%%al,%%al\n\t"
39487e239b9SJérôme Duval     "jne	1b\n\t"
39587e239b9SJérôme Duval     "rep; stosb\n"
39687e239b9SJérôme Duval     "2:"
39787e239b9SJérôme Duval     : "=&S" (__d0), "=&D" (__d1), "=&c" (__d2)
39887e239b9SJérôme Duval     : "0" (__src), "1" (__dest), "2" (__n)
39987e239b9SJérôme Duval     : "ax", "memory", "cc");
40087e239b9SJérôme Duval  return __dest;
40187e239b9SJérôme Duval}
40287e239b9SJérôme Duval#endif
40387e239b9SJérôme Duval
40487e239b9SJérôme Duval/* Append SRC onto DEST.  */
40587e239b9SJérôme Duval#define _HAVE_STRING_ARCH_strcat 1
40687e239b9SJérôme Duval#ifndef _FORCE_INLINES
40787e239b9SJérôme Duval__STRING_INLINE char *
40887e239b9SJérôme Duvalstrcat (char *__dest, __const char *__src)
40987e239b9SJérôme Duval{
41087e239b9SJérôme Duval  register unsigned long int __d0, __d1, __d2, __d3;
41187e239b9SJérôme Duval  __asm__ __volatile__
41287e239b9SJérôme Duval    ("cld\n\t"
41387e239b9SJérôme Duval     "repne; scasb\n\t"
41487e239b9SJérôme Duval     "decl	%1\n"
41587e239b9SJérôme Duval     "1:\n\t"
41687e239b9SJérôme Duval     "lodsb\n\t"
41787e239b9SJérôme Duval     "stosb\n\t"
41887e239b9SJérôme Duval     "testb	%%al,%%al\n\t"
41987e239b9SJérôme Duval     "jne	1b"
42087e239b9SJérôme Duval     : "=&S" (__d0), "=&D" (__d1), "=&c" (__d2), "=&a" (__d3)
42187e239b9SJérôme Duval     : "0" (__src), "1" (__dest), "2" (0xffffffff), "3" (0)
42287e239b9SJérôme Duval     : "memory", "cc");
42387e239b9SJérôme Duval  return __dest;
42487e239b9SJérôme Duval}
42587e239b9SJérôme Duval#endif
42687e239b9SJérôme Duval
42787e239b9SJérôme Duval/* Append no more than N characters from SRC onto DEST.  */
42887e239b9SJérôme Duval#define _HAVE_STRING_ARCH_strncat 1
42987e239b9SJérôme Duval#ifndef _FORCE_INLINES
43087e239b9SJérôme Duval__STRING_INLINE char *
43187e239b9SJérôme Duvalstrncat (char *__dest, __const char *__src, size_t __n)
43287e239b9SJérôme Duval{
43387e239b9SJérôme Duval  register unsigned long int __d0, __d1, __d2, __d3;
43487e239b9SJérôme Duval  __asm__ __volatile__
43587e239b9SJérôme Duval    ("cld\n\t"
43687e239b9SJérôme Duval     "repne; scasb\n\t"
43787e239b9SJérôme Duval     "decl	%1\n\t"
43887e239b9SJérôme Duval     "movl	%4,%2\n"
43987e239b9SJérôme Duval     "1:\n\t"
44087e239b9SJérôme Duval     "decl	%2\n\t"
44187e239b9SJérôme Duval     "js	2f\n\t"
44287e239b9SJérôme Duval     "lodsb\n\t"
44387e239b9SJérôme Duval     "stosb\n\t"
44487e239b9SJérôme Duval     "testb	%%al,%%al\n\t"
44587e239b9SJérôme Duval     "jne	1b\n\t"
44687e239b9SJérôme Duval     "jmp	3f\n"
44787e239b9SJérôme Duval     "2:\n\t"
44887e239b9SJérôme Duval     "xorl	%3,%3\n\t"
44987e239b9SJérôme Duval     "stosb\n"
45087e239b9SJérôme Duval     "3:"
45187e239b9SJérôme Duval     : "=&S" (__d0), "=&D" (__d1), "=&c" (__d2), "=&a" (__d3)
45287e239b9SJérôme Duval     : "g" (__n), "0" (__src), "1" (__dest), "2" (0xffffffff), "3" (0)
45387e239b9SJérôme Duval     : "memory", "cc");
45487e239b9SJérôme Duval  return __dest;
45587e239b9SJérôme Duval}
45687e239b9SJérôme Duval#endif
45787e239b9SJérôme Duval
45887e239b9SJérôme Duval/* Compare S1 and S2.  */
45987e239b9SJérôme Duval#define _HAVE_STRING_ARCH_strcmp 1
46087e239b9SJérôme Duval#ifndef _FORCE_INLINES
46187e239b9SJérôme Duval__STRING_INLINE int
46287e239b9SJérôme Duvalstrcmp (__const char *__s1, __const char *__s2)
46387e239b9SJérôme Duval{
46487e239b9SJérôme Duval  register unsigned long int __d0, __d1;
46587e239b9SJérôme Duval  register int __res;
46687e239b9SJérôme Duval  __asm__ __volatile__
46787e239b9SJérôme Duval    ("cld\n"
46887e239b9SJérôme Duval     "1:\n\t"
46987e239b9SJérôme Duval     "lodsb\n\t"
47087e239b9SJérôme Duval     "scasb\n\t"
47187e239b9SJérôme Duval     "jne	2f\n\t"
47287e239b9SJérôme Duval     "testb	%%al,%%al\n\t"
47387e239b9SJérôme Duval     "jne	1b\n\t"
47487e239b9SJérôme Duval     "xorl	%%eax,%%eax\n\t"
47587e239b9SJérôme Duval     "jmp	3f\n"
47687e239b9SJérôme Duval     "2:\n\t"
47787e239b9SJérôme Duval     "sbbl	%%eax,%%eax\n\t"
47887e239b9SJérôme Duval     "orb	$1,%%al\n"
47987e239b9SJérôme Duval     "3:"
48087e239b9SJérôme Duval     : "=a" (__res), "=&S" (__d0), "=&D" (__d1)
48187e239b9SJérôme Duval     : "1" (__s1), "2" (__s2),
48287e239b9SJérôme Duval       "m" ( *(struct { char __x[0xfffffff]; } *)__s1),
48387e239b9SJérôme Duval       "m" ( *(struct { char __x[0xfffffff]; } *)__s2)
48487e239b9SJérôme Duval     : "cc");
48587e239b9SJérôme Duval  return __res;
48687e239b9SJérôme Duval}
48787e239b9SJérôme Duval#endif
48887e239b9SJérôme Duval
48987e239b9SJérôme Duval/* Compare N characters of S1 and S2.  */
49087e239b9SJérôme Duval#define _HAVE_STRING_ARCH_strncmp 1
49187e239b9SJérôme Duval#ifndef _FORCE_INLINES
49287e239b9SJérôme Duval__STRING_INLINE int
49387e239b9SJérôme Duvalstrncmp (__const char *__s1, __const char *__s2, size_t __n)
49487e239b9SJérôme Duval{
49587e239b9SJérôme Duval  register unsigned long int __d0, __d1, __d2;
49687e239b9SJérôme Duval  register int __res;
49787e239b9SJérôme Duval  __asm__ __volatile__
49887e239b9SJérôme Duval    ("cld\n"
49987e239b9SJérôme Duval     "1:\n\t"
50087e239b9SJérôme Duval     "decl	%3\n\t"
50187e239b9SJérôme Duval     "js	2f\n\t"
50287e239b9SJérôme Duval     "lodsb\n\t"
50387e239b9SJérôme Duval     "scasb\n\t"
50487e239b9SJérôme Duval     "jne	3f\n\t"
50587e239b9SJérôme Duval     "testb	%%al,%%al\n\t"
50687e239b9SJérôme Duval     "jne	1b\n"
50787e239b9SJérôme Duval     "2:\n\t"
50887e239b9SJérôme Duval     "xorl	%%eax,%%eax\n\t"
50987e239b9SJérôme Duval     "jmp	4f\n"
51087e239b9SJérôme Duval     "3:\n\t"
51187e239b9SJérôme Duval     "sbbl	%%eax,%%eax\n\t"
51287e239b9SJérôme Duval     "orb	$1,%%al\n"
51387e239b9SJérôme Duval     "4:"
51487e239b9SJérôme Duval     : "=a" (__res), "=&S" (__d0), "=&D" (__d1), "=&c" (__d2)
51587e239b9SJérôme Duval     : "1" (__s1), "2" (__s2), "3" (__n),
51687e239b9SJérôme Duval       "m" ( *(struct { __extension__ char __x[__n]; } *)__s1),
51787e239b9SJérôme Duval       "m" ( *(struct { __extension__ char __x[__n]; } *)__s2)
51887e239b9SJérôme Duval     : "cc");
51987e239b9SJérôme Duval  return __res;
52087e239b9SJérôme Duval}
52187e239b9SJérôme Duval#endif
52287e239b9SJérôme Duval
52387e239b9SJérôme Duval/* Find the first occurrence of C in S.  */
52487e239b9SJérôme Duval#define _HAVE_STRING_ARCH_strchr 1
52587e239b9SJérôme Duval#define _USE_STRING_ARCH_strchr 1
52687e239b9SJérôme Duval#define strchr(s, c) \
52787e239b9SJérôme Duval  (__extension__ (__builtin_constant_p (c)				      \
52887e239b9SJérôme Duval		  ? __strchr_c (s, ((c) & 0xff) << 8)			      \
52987e239b9SJérôme Duval		  : __strchr_g (s, c)))
53087e239b9SJérôme Duval
53187e239b9SJérôme Duval__STRING_INLINE char *__strchr_g (__const char *__s, int __c);
53287e239b9SJérôme Duval
53387e239b9SJérôme Duval__STRING_INLINE char *
53487e239b9SJérôme Duval__strchr_g (__const char *__s, int __c)
53587e239b9SJérôme Duval{
53687e239b9SJérôme Duval  register unsigned long int __d0;
53787e239b9SJérôme Duval  register char *__res;
53887e239b9SJérôme Duval  __asm__ __volatile__
53987e239b9SJérôme Duval    ("cld\n\t"
54087e239b9SJérôme Duval     "movb	%%al,%%ah\n"
54187e239b9SJérôme Duval     "1:\n\t"
54287e239b9SJérôme Duval     "lodsb\n\t"
54387e239b9SJérôme Duval     "cmpb	%%ah,%%al\n\t"
54487e239b9SJérôme Duval     "je	2f\n\t"
54587e239b9SJérôme Duval     "testb	%%al,%%al\n\t"
54687e239b9SJérôme Duval     "jne	1b\n\t"
54787e239b9SJérôme Duval     "movl	$1,%1\n"
54887e239b9SJérôme Duval     "2:\n\t"
54987e239b9SJérôme Duval     "movl	%1,%0"
55087e239b9SJérôme Duval     : "=a" (__res), "=&S" (__d0)
55187e239b9SJérôme Duval     : "0" (__c), "1" (__s),
55287e239b9SJérôme Duval       "m" ( *(struct { char __x[0xfffffff]; } *)__s)
55387e239b9SJérôme Duval     : "cc");
55487e239b9SJérôme Duval  return __res - 1;
55587e239b9SJérôme Duval}
55687e239b9SJérôme Duval
55787e239b9SJérôme Duval__STRING_INLINE char *__strchr_c (__const char *__s, int __c);
55887e239b9SJérôme Duval
55987e239b9SJérôme Duval__STRING_INLINE char *
56087e239b9SJérôme Duval__strchr_c (__const char *__s, int __c)
56187e239b9SJérôme Duval{
56287e239b9SJérôme Duval  register unsigned long int __d0;
56387e239b9SJérôme Duval  register char *__res;
56487e239b9SJérôme Duval  __asm__ __volatile__
56587e239b9SJérôme Duval    ("cld\n\t"
56687e239b9SJérôme Duval     "1:\n\t"
56787e239b9SJérôme Duval     "lodsb\n\t"
56887e239b9SJérôme Duval     "cmpb	%%ah,%%al\n\t"
56987e239b9SJérôme Duval     "je	2f\n\t"
57087e239b9SJérôme Duval     "testb	%%al,%%al\n\t"
57187e239b9SJérôme Duval     "jne	1b\n\t"
57287e239b9SJérôme Duval     "movl	$1,%1\n"
57387e239b9SJérôme Duval     "2:\n\t"
57487e239b9SJérôme Duval     "movl	%1,%0"
57587e239b9SJérôme Duval     : "=a" (__res), "=&S" (__d0)
57687e239b9SJérôme Duval     : "0" (__c), "1" (__s),
57787e239b9SJérôme Duval       "m" ( *(struct { char __x[0xfffffff]; } *)__s)
57887e239b9SJérôme Duval     : "cc");
57987e239b9SJérôme Duval  return __res - 1;
58087e239b9SJérôme Duval}
58187e239b9SJérôme Duval
58287e239b9SJérôme Duval
58387e239b9SJérôme Duval/* Find the first occurrence of C in S or the final NUL byte.  */
58487e239b9SJérôme Duval#define _HAVE_STRING_ARCH_strchrnul 1
58587e239b9SJérôme Duval#define __strchrnul(s, c) \
58687e239b9SJérôme Duval  (__extension__ (__builtin_constant_p (c)				      \
58787e239b9SJérôme Duval		  ? ((c) == '\0'					      \
58887e239b9SJérôme Duval		     ? (char *) __rawmemchr (s, c)			      \
58987e239b9SJérôme Duval		     : __strchrnul_c (s, ((c) & 0xff) << 8))		      \
59087e239b9SJérôme Duval		  : __strchrnul_g (s, c)))
59187e239b9SJérôme Duval
59287e239b9SJérôme Duval__STRING_INLINE char *__strchrnul_g (__const char *__s, int __c);
59387e239b9SJérôme Duval
59487e239b9SJérôme Duval__STRING_INLINE char *
59587e239b9SJérôme Duval__strchrnul_g (__const char *__s, int __c)
59687e239b9SJérôme Duval{
59787e239b9SJérôme Duval  register unsigned long int __d0;
59887e239b9SJérôme Duval  register char *__res;
59987e239b9SJérôme Duval  __asm__ __volatile__
60087e239b9SJérôme Duval    ("cld\n\t"
60187e239b9SJérôme Duval     "movb	%%al,%%ah\n"
60287e239b9SJérôme Duval     "1:\n\t"
60387e239b9SJérôme Duval     "lodsb\n\t"
60487e239b9SJérôme Duval     "cmpb	%%ah,%%al\n\t"
60587e239b9SJérôme Duval     "je	2f\n\t"
60687e239b9SJérôme Duval     "testb	%%al,%%al\n\t"
60787e239b9SJérôme Duval     "jne	1b\n\t"
60887e239b9SJérôme Duval     "2:\n\t"
60987e239b9SJérôme Duval     "movl	%1,%0"
61087e239b9SJérôme Duval     : "=a" (__res), "=&S" (__d0)
61187e239b9SJérôme Duval     : "0" (__c), "1" (__s),
61287e239b9SJérôme Duval       "m" ( *(struct { char __x[0xfffffff]; } *)__s)
61387e239b9SJérôme Duval     : "cc");
61487e239b9SJérôme Duval  return __res - 1;
61587e239b9SJérôme Duval}
61687e239b9SJérôme Duval
61787e239b9SJérôme Duval__STRING_INLINE char *__strchrnul_c (__const char *__s, int __c);
61887e239b9SJérôme Duval
61987e239b9SJérôme Duval__STRING_INLINE char *
62087e239b9SJérôme Duval__strchrnul_c (__const char *__s, int __c)
62187e239b9SJérôme Duval{
62287e239b9SJérôme Duval  register unsigned long int __d0;
62387e239b9SJérôme Duval  register char *__res;
62487e239b9SJérôme Duval  __asm__ __volatile__
62587e239b9SJérôme Duval    ("cld\n\t"
62687e239b9SJérôme Duval     "1:\n\t"
62787e239b9SJérôme Duval     "lodsb\n\t"
62887e239b9SJérôme Duval     "cmpb	%%ah,%%al\n\t"
62987e239b9SJérôme Duval     "je	2f\n\t"
63087e239b9SJérôme Duval     "testb	%%al,%%al\n\t"
63187e239b9SJérôme Duval     "jne	1b\n\t"
63287e239b9SJérôme Duval     "2:\n\t"
63387e239b9SJérôme Duval     "movl	%1,%0"
63487e239b9SJérôme Duval     : "=a" (__res), "=&S" (__d0)
63587e239b9SJérôme Duval     : "0" (__c), "1" (__s),
63687e239b9SJérôme Duval       "m" ( *(struct { char __x[0xfffffff]; } *)__s)
63787e239b9SJérôme Duval     : "cc");
63887e239b9SJérôme Duval  return __res - 1;
63987e239b9SJérôme Duval}
64087e239b9SJérôme Duval#ifdef __USE_GNU
64187e239b9SJérôme Duval# define strchrnul(s, c) __strchrnul (s, c)
64287e239b9SJérôme Duval#endif
64387e239b9SJérôme Duval
64487e239b9SJérôme Duval
64587e239b9SJérôme Duval/* Return the length of the initial segment of S which
64687e239b9SJérôme Duval   consists entirely of characters not in REJECT.  */
64787e239b9SJérôme Duval#define _HAVE_STRING_ARCH_strcspn 1
64887e239b9SJérôme Duval#ifndef _FORCE_INLINES
64987e239b9SJérôme Duval# ifdef __PIC__
65087e239b9SJérôme Duval__STRING_INLINE size_t
65187e239b9SJérôme Duvalstrcspn (__const char *__s, __const char *__reject)
65287e239b9SJérôme Duval{
65387e239b9SJérôme Duval  register unsigned long int __d0, __d1, __d2;
65487e239b9SJérôme Duval  register char *__res;
65587e239b9SJérôme Duval  __asm__ __volatile__
65687e239b9SJérôme Duval    ("pushl	%%ebx\n\t"
65787e239b9SJérôme Duval     "cld\n\t"
65887e239b9SJérôme Duval     "movl	%4,%%edi\n\t"
65987e239b9SJérôme Duval     "repne; scasb\n\t"
66087e239b9SJérôme Duval     "notl	%%ecx\n\t"
66187e239b9SJérôme Duval     "decl	%%ecx\n\t"
66287e239b9SJérôme Duval     "movl	%%ecx,%%ebx\n"
66387e239b9SJérôme Duval     "1:\n\t"
66487e239b9SJérôme Duval     "lodsb\n\t"
66587e239b9SJérôme Duval     "testb	%%al,%%al\n\t"
66687e239b9SJérôme Duval     "je	2f\n\t"
66787e239b9SJérôme Duval     "movl	%4,%%edi\n\t"
66887e239b9SJérôme Duval     "movl	%%ebx,%%ecx\n\t"
66987e239b9SJérôme Duval     "repne; scasb\n\t"
67087e239b9SJérôme Duval     "jne	1b\n"
67187e239b9SJérôme Duval     "2:\n\t"
67287e239b9SJérôme Duval     "popl	%%ebx"
67387e239b9SJérôme Duval     : "=&S" (__res), "=&a" (__d0), "=&c" (__d1), "=&D" (__d2)
67487e239b9SJérôme Duval     : "d" (__reject), "0" (__s), "1" (0), "2" (0xffffffff),
67587e239b9SJérôme Duval       "m" ( *(struct { char __x[0xfffffff]; } *)__s)
67687e239b9SJérôme Duval     : "cc");
67787e239b9SJérôme Duval  return (__res - 1) - __s;
67887e239b9SJérôme Duval}
67987e239b9SJérôme Duval# else
68087e239b9SJérôme Duval__STRING_INLINE size_t
68187e239b9SJérôme Duvalstrcspn (__const char *__s, __const char *__reject)
68287e239b9SJérôme Duval{
68387e239b9SJérôme Duval  register unsigned long int __d0, __d1, __d2, __d3;
68487e239b9SJérôme Duval  register char *__res;
68587e239b9SJérôme Duval  __asm__ __volatile__
68687e239b9SJérôme Duval    ("cld\n\t"
68787e239b9SJérôme Duval     "movl	%5,%%edi\n\t"
68887e239b9SJérôme Duval     "repne; scasb\n\t"
68987e239b9SJérôme Duval     "notl	%%ecx\n\t"
69087e239b9SJérôme Duval     "decl	%%ecx\n\t"
69187e239b9SJérôme Duval     "movl	%%ecx,%%edx\n"
69287e239b9SJérôme Duval     "1:\n\t"
69387e239b9SJérôme Duval     "lodsb\n\t"
69487e239b9SJérôme Duval     "testb	%%al,%%al\n\t"
69587e239b9SJérôme Duval     "je	2f\n\t"
69687e239b9SJérôme Duval     "movl	%5,%%edi\n\t"
69787e239b9SJérôme Duval     "movl	%%edx,%%ecx\n\t"
69887e239b9SJérôme Duval     "repne; scasb\n\t"
69987e239b9SJérôme Duval     "jne	1b\n"
70087e239b9SJérôme Duval     "2:"
70187e239b9SJérôme Duval     : "=&S" (__res), "=&a" (__d0), "=&c" (__d1), "=&d" (__d2), "=&D" (__d3)
70287e239b9SJérôme Duval     : "g" (__reject), "0" (__s), "1" (0), "2" (0xffffffff),
70387e239b9SJérôme Duval       "m" ( *(struct { char __x[0xfffffff]; } *)__s)
70487e239b9SJérôme Duval     : "cc");
70587e239b9SJérôme Duval  return (__res - 1) - __s;
70687e239b9SJérôme Duval}
70787e239b9SJérôme Duval# endif
70887e239b9SJérôme Duval#endif
70987e239b9SJérôme Duval
71087e239b9SJérôme Duval
71187e239b9SJérôme Duval/* Return the length of the initial segment of S which
71287e239b9SJérôme Duval   consists entirely of characters in ACCEPT.  */
71387e239b9SJérôme Duval#define _HAVE_STRING_ARCH_strspn 1
71487e239b9SJérôme Duval#ifndef _FORCE_INLINES
71587e239b9SJérôme Duval# ifdef __PIC__
71687e239b9SJérôme Duval__STRING_INLINE size_t
71787e239b9SJérôme Duvalstrspn (__const char *__s, __const char *__accept)
71887e239b9SJérôme Duval{
71987e239b9SJérôme Duval  register unsigned long int __d0, __d1, __d2;
72087e239b9SJérôme Duval  register char *__res;
72187e239b9SJérôme Duval  __asm__ __volatile__
72287e239b9SJérôme Duval    ("pushl	%%ebx\n\t"
72387e239b9SJérôme Duval     "cld\n\t"
72487e239b9SJérôme Duval     "movl	%4,%%edi\n\t"
72587e239b9SJérôme Duval     "repne; scasb\n\t"
72687e239b9SJérôme Duval     "notl	%%ecx\n\t"
72787e239b9SJérôme Duval     "decl	%%ecx\n\t"
72887e239b9SJérôme Duval     "movl	%%ecx,%%ebx\n"
72987e239b9SJérôme Duval     "1:\n\t"
73087e239b9SJérôme Duval     "lodsb\n\t"
73187e239b9SJérôme Duval     "testb	%%al,%%al\n\t"
73287e239b9SJérôme Duval     "je	2f\n\t"
73387e239b9SJérôme Duval     "movl	%4,%%edi\n\t"
73487e239b9SJérôme Duval     "movl	%%ebx,%%ecx\n\t"
73587e239b9SJérôme Duval     "repne; scasb\n\t"
73687e239b9SJérôme Duval     "je	1b\n"
73787e239b9SJérôme Duval     "2:\n\t"
73887e239b9SJérôme Duval     "popl	%%ebx"
73987e239b9SJérôme Duval     : "=&S" (__res), "=&a" (__d0), "=&c" (__d1), "=&D" (__d2)
74087e239b9SJérôme Duval     : "r" (__accept), "0" (__s), "1" (0), "2" (0xffffffff),
74187e239b9SJérôme Duval       "m" ( *(struct { char __x[0xfffffff]; } *)__s)
74287e239b9SJérôme Duval     : "cc");
74387e239b9SJérôme Duval  return (__res - 1) - __s;
74487e239b9SJérôme Duval}
74587e239b9SJérôme Duval# else
74687e239b9SJérôme Duval__STRING_INLINE size_t
74787e239b9SJérôme Duvalstrspn (__const char *__s, __const char *__accept)
74887e239b9SJérôme Duval{
74987e239b9SJérôme Duval  register unsigned long int __d0, __d1, __d2, __d3;
75087e239b9SJérôme Duval  register char *__res;
75187e239b9SJérôme Duval  __asm__ __volatile__
75287e239b9SJérôme Duval    ("cld\n\t"
75387e239b9SJérôme Duval     "movl	%5,%%edi\n\t"
75487e239b9SJérôme Duval     "repne; scasb\n\t"
75587e239b9SJérôme Duval     "notl	%%ecx\n\t"
75687e239b9SJérôme Duval     "decl	%%ecx\n\t"
75787e239b9SJérôme Duval     "movl	%%ecx,%%edx\n"
75887e239b9SJérôme Duval     "1:\n\t"
75987e239b9SJérôme Duval     "lodsb\n\t"
76087e239b9SJérôme Duval     "testb	%%al,%%al\n\t"
76187e239b9SJérôme Duval     "je	2f\n\t"
76287e239b9SJérôme Duval     "movl	%5,%%edi\n\t"
76387e239b9SJérôme Duval     "movl	%%edx,%%ecx\n\t"
76487e239b9SJérôme Duval     "repne; scasb\n\t"
76587e239b9SJérôme Duval     "je	1b\n"
76687e239b9SJérôme Duval     "2:"
76787e239b9SJérôme Duval     : "=&S" (__res), "=&a" (__d0), "=&c" (__d1), "=&d" (__d2), "=&D" (__d3)
76887e239b9SJérôme Duval     : "g" (__accept), "0" (__s), "1" (0), "2" (0xffffffff),
76987e239b9SJérôme Duval       "m" ( *(struct { char __x[0xfffffff]; } *)__s)
77087e239b9SJérôme Duval     : "cc");
77187e239b9SJérôme Duval  return (__res - 1) - __s;
77287e239b9SJérôme Duval}
77387e239b9SJérôme Duval# endif
77487e239b9SJérôme Duval#endif
77587e239b9SJérôme Duval
77687e239b9SJérôme Duval
77787e239b9SJérôme Duval/* Find the first occurrence in S of any character in ACCEPT.  */
77887e239b9SJérôme Duval#define _HAVE_STRING_ARCH_strpbrk 1
77987e239b9SJérôme Duval#ifndef _FORCE_INLINES
78087e239b9SJérôme Duval# ifdef __PIC__
78187e239b9SJérôme Duval__STRING_INLINE char *
78287e239b9SJérôme Duvalstrpbrk (__const char *__s, __const char *__accept)
78387e239b9SJérôme Duval{
78487e239b9SJérôme Duval  unsigned long int __d0, __d1, __d2;
78587e239b9SJérôme Duval  register char *__res;
78687e239b9SJérôme Duval  __asm__ __volatile__
78787e239b9SJérôme Duval    ("pushl	%%ebx\n\t"
78887e239b9SJérôme Duval     "cld\n\t"
78987e239b9SJérôme Duval     "movl	%4,%%edi\n\t"
79087e239b9SJérôme Duval     "repne; scasb\n\t"
79187e239b9SJérôme Duval     "notl	%%ecx\n\t"
79287e239b9SJérôme Duval     "decl	%%ecx\n\t"
79387e239b9SJérôme Duval     "movl	%%ecx,%%ebx\n"
79487e239b9SJérôme Duval     "1:\n\t"
79587e239b9SJérôme Duval     "lodsb\n\t"
79687e239b9SJérôme Duval     "testb	%%al,%%al\n\t"
79787e239b9SJérôme Duval     "je	2f\n\t"
79887e239b9SJérôme Duval     "movl	%4,%%edi\n\t"
79987e239b9SJérôme Duval     "movl	%%ebx,%%ecx\n\t"
80087e239b9SJérôme Duval     "repne; scasb\n\t"
80187e239b9SJérôme Duval     "jne	1b\n\t"
80287e239b9SJérôme Duval     "decl	%0\n\t"
80387e239b9SJérôme Duval     "jmp	3f\n"
80487e239b9SJérôme Duval     "2:\n\t"
80587e239b9SJérôme Duval     "xorl	%0,%0\n"
80687e239b9SJérôme Duval     "3:\n\t"
80787e239b9SJérôme Duval     "popl	%%ebx"
80887e239b9SJérôme Duval     : "=&S" (__res), "=&a" (__d0), "=&c" (__d1), "=&D" (__d2)
80987e239b9SJérôme Duval     : "r" (__accept), "0" (__s), "1" (0), "2" (0xffffffff),
81087e239b9SJérôme Duval       "m" ( *(struct { char __x[0xfffffff]; } *)__s)
81187e239b9SJérôme Duval     : "cc");
81287e239b9SJérôme Duval  return __res;
81387e239b9SJérôme Duval}
81487e239b9SJérôme Duval# else
81587e239b9SJérôme Duval__STRING_INLINE char *
81687e239b9SJérôme Duvalstrpbrk (__const char *__s, __const char *__accept)
81787e239b9SJérôme Duval{
81887e239b9SJérôme Duval  register unsigned long int __d0, __d1, __d2, __d3;
81987e239b9SJérôme Duval  register char *__res;
82087e239b9SJérôme Duval  __asm__ __volatile__
82187e239b9SJérôme Duval    ("cld\n\t"
82287e239b9SJérôme Duval     "movl	%5,%%edi\n\t"
82387e239b9SJérôme Duval     "repne; scasb\n\t"
82487e239b9SJérôme Duval     "notl	%%ecx\n\t"
82587e239b9SJérôme Duval     "decl	%%ecx\n\t"
82687e239b9SJérôme Duval     "movl	%%ecx,%%edx\n"
82787e239b9SJérôme Duval     "1:\n\t"
82887e239b9SJérôme Duval     "lodsb\n\t"
82987e239b9SJérôme Duval     "testb	%%al,%%al\n\t"
83087e239b9SJérôme Duval     "je	2f\n\t"
83187e239b9SJérôme Duval     "movl	%5,%%edi\n\t"
83287e239b9SJérôme Duval     "movl	%%edx,%%ecx\n\t"
83387e239b9SJérôme Duval     "repne; scasb\n\t"
83487e239b9SJérôme Duval     "jne	1b\n\t"
83587e239b9SJérôme Duval     "decl	%0\n\t"
83687e239b9SJérôme Duval     "jmp	3f\n"
83787e239b9SJérôme Duval     "2:\n\t"
83887e239b9SJérôme Duval     "xorl	%0,%0\n"
83987e239b9SJérôme Duval     "3:"
84087e239b9SJérôme Duval     : "=&S" (__res), "=&a" (__d0), "=&c" (__d1), "=&d" (__d2), "=&D" (__d3)
84187e239b9SJérôme Duval     : "g" (__accept), "0" (__s), "1" (0), "2" (0xffffffff),
84287e239b9SJérôme Duval       "m" ( *(struct { char __x[0xfffffff]; } *)__s)
84387e239b9SJérôme Duval     : "cc");
84487e239b9SJérôme Duval  return __res;
84587e239b9SJérôme Duval}
84687e239b9SJérôme Duval# endif
84787e239b9SJérôme Duval#endif
84887e239b9SJérôme Duval
84987e239b9SJérôme Duval
85087e239b9SJérôme Duval/* Find the first occurrence of NEEDLE in HAYSTACK.  */
85187e239b9SJérôme Duval#define _HAVE_STRING_ARCH_strstr 1
85287e239b9SJérôme Duval#ifndef _FORCE_INLINES
85387e239b9SJérôme Duval# ifdef __PIC__
85487e239b9SJérôme Duval__STRING_INLINE char *
85587e239b9SJérôme Duvalstrstr (__const char *__haystack, __const char *__needle)
85687e239b9SJérôme Duval{
85787e239b9SJérôme Duval  register unsigned long int __d0, __d1, __d2;
85887e239b9SJérôme Duval  register char *__res;
85987e239b9SJérôme Duval  __asm__ __volatile__
86087e239b9SJérôme Duval    ("pushl	%%ebx\n\t"
86187e239b9SJérôme Duval     "cld\n\t" \
86287e239b9SJérôme Duval     "movl	%4,%%edi\n\t"
86387e239b9SJérôme Duval     "repne; scasb\n\t"
86487e239b9SJérôme Duval     "notl	%%ecx\n\t"
86587e239b9SJérôme Duval     "decl	%%ecx\n\t"	/* NOTE! This also sets Z if searchstring='' */
86687e239b9SJérôme Duval     "movl	%%ecx,%%ebx\n"
86787e239b9SJérôme Duval     "1:\n\t"
86887e239b9SJérôme Duval     "movl	%4,%%edi\n\t"
86987e239b9SJérôme Duval     "movl	%%esi,%%eax\n\t"
87087e239b9SJérôme Duval     "movl	%%ebx,%%ecx\n\t"
87187e239b9SJérôme Duval     "repe; cmpsb\n\t"
87287e239b9SJérôme Duval     "je	2f\n\t"		/* also works for empty string, see above */
87387e239b9SJérôme Duval     "xchgl	%%eax,%%esi\n\t"
87487e239b9SJérôme Duval     "incl	%%esi\n\t"
87587e239b9SJérôme Duval     "cmpb	$0,-1(%%eax)\n\t"
87687e239b9SJérôme Duval     "jne	1b\n\t"
87787e239b9SJérôme Duval     "xorl	%%eax,%%eax\n\t"
87887e239b9SJérôme Duval     "2:\n\t"
87987e239b9SJérôme Duval     "popl	%%ebx"
88087e239b9SJérôme Duval     : "=&a" (__res), "=&c" (__d0), "=&S" (__d1), "=&D" (__d2)
88187e239b9SJérôme Duval     : "r" (__needle), "0" (0), "1" (0xffffffff), "2" (__haystack)
88287e239b9SJérôme Duval     : "memory", "cc");
88387e239b9SJérôme Duval  return __res;
88487e239b9SJérôme Duval}
88587e239b9SJérôme Duval# else
88687e239b9SJérôme Duval__STRING_INLINE char *
88787e239b9SJérôme Duvalstrstr (__const char *__haystack, __const char *__needle)
88887e239b9SJérôme Duval{
88987e239b9SJérôme Duval  register unsigned long int __d0, __d1, __d2, __d3;
89087e239b9SJérôme Duval  register char *__res;
89187e239b9SJérôme Duval  __asm__ __volatile__
89287e239b9SJérôme Duval    ("cld\n\t" \
89387e239b9SJérôme Duval     "movl	%5,%%edi\n\t"
89487e239b9SJérôme Duval     "repne; scasb\n\t"
89587e239b9SJérôme Duval     "notl	%%ecx\n\t"
89687e239b9SJérôme Duval     "decl	%%ecx\n\t"	/* NOTE! This also sets Z if searchstring='' */
89787e239b9SJérôme Duval     "movl	%%ecx,%%edx\n"
89887e239b9SJérôme Duval     "1:\n\t"
89987e239b9SJérôme Duval     "movl	%5,%%edi\n\t"
90087e239b9SJérôme Duval     "movl	%%esi,%%eax\n\t"
90187e239b9SJérôme Duval     "movl	%%edx,%%ecx\n\t"
90287e239b9SJérôme Duval     "repe; cmpsb\n\t"
90387e239b9SJérôme Duval     "je	2f\n\t"		/* also works for empty string, see above */
90487e239b9SJérôme Duval     "xchgl	%%eax,%%esi\n\t"
90587e239b9SJérôme Duval     "incl	%%esi\n\t"
90687e239b9SJérôme Duval     "cmpb	$0,-1(%%eax)\n\t"
90787e239b9SJérôme Duval     "jne	1b\n\t"
90887e239b9SJérôme Duval     "xorl	%%eax,%%eax\n\t"
90987e239b9SJérôme Duval     "2:"
91087e239b9SJérôme Duval     : "=&a" (__res), "=&c" (__d0), "=&S" (__d1), "=&d" (__d2), "=&D" (__d3)
91187e239b9SJérôme Duval     : "g" (__needle), "0" (0), "1" (0xffffffff), "2" (__haystack)
91287e239b9SJérôme Duval     : "memory", "cc");
91387e239b9SJérôme Duval  return __res;
91487e239b9SJérôme Duval}
91587e239b9SJérôme Duval# endif
91687e239b9SJérôme Duval#endif
91787e239b9SJérôme Duval
91887e239b9SJérôme Duval#ifndef _FORCE_INLINES
91987e239b9SJérôme Duval# undef __STRING_INLINE
92087e239b9SJérôme Duval#endif
92187e239b9SJérôme Duval
92287e239b9SJérôme Duval#endif	/* use string inlines && GNU CC */
923