/* Optimized, inlined string functions. i486 version.
- Copyright (C) 1997, 1998, 1999, 2000, 2001 Free Software Foundation, Inc.
+ Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002 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
"movsw\n"
"2:\n\t"
"rep; movsl"
- : "=&c" (__d0), "=&D" (__d1), "=&S" (__d2)
- : "0" (__n), "1" (__tmp), "2" (__src)
- : "memory", "cc");
+ : "=&c" (__d0), "=&D" (__d1), "=&S" (__d2),
+ "=m" ( *(struct { __extension__ char __x[__n]; } *)__dest)
+ : "0" (__n), "1" (__tmp), "2" (__src),
+ "m" ( *(struct { __extension__ char __x[__n]; } *)__src)
+ : "cc");
return __dest;
}
__asm__ __volatile__
("cld\n\t"
"rep; movsb"
- : "=&c" (__d0), "=&S" (__d1), "=&D" (__d2)
- : "0" (__n), "1" (__src), "2" (__tmp)
- : "memory");
+ : "=&c" (__d0), "=&S" (__d1), "=&D" (__d2),
+ "=m" ( *(struct { __extension__ char __x[__n]; } *)__dest)
+ : "0" (__n), "1" (__src), "2" (__tmp),
+ "m" ( *(struct { __extension__ char __x[__n]; } *)__src));
else
__asm__ __volatile__
("std\n\t"
"rep; movsb\n\t"
"cld"
- : "=&c" (__d0), "=&S" (__d1), "=&D" (__d2)
+ : "=&c" (__d0), "=&S" (__d1), "=&D" (__d2),
+ "=m" ( *(struct { __extension__ char __x[__n]; } *)__dest)
: "0" (__n), "1" (__n - 1 + (__const char *) __src),
- "2" (__n - 1 + (char *) __tmp)
- : "memory");
+ "2" (__n - 1 + (char *) __tmp),
+ "m" ( *(struct { __extension__ char __x[__n]; } *)__src));
return __dest;
}
#endif
"orl $1,%0\n"
"1:"
: "=a" (__res), "=&S" (__d0), "=&D" (__d1), "=&c" (__d2)
- : "0" (0), "1" (__s1), "2" (__s2), "3" (__n)
+ : "0" (0), "1" (__s1), "2" (__s2), "3" (__n),
+ "m" ( *(struct { __extension__ char __x[__n]; } *)__s1),
+ "m" ( *(struct { __extension__ char __x[__n]; } *)__s2)
: "cc");
return __res;
}
__asm__ __volatile__
("cld\n\t"
"rep; stosl"
- : "=&a" (__c), "=&D" (__tmp), "=&c" (__d0)
+ : "=&a" (__c), "=&D" (__tmp), "=&c" (__d0),
+ "=m" ( *(struct { __extension__ char __x[__n]; } *)__s)
: "0" ((unsigned int) __c), "1" (__tmp), "2" (__n / 4)
- : "memory", "cc");
+ : "cc");
#else
__asm__ __volatile__
("1:\n\t"
"addl $4,%1\n\t"
"decl %2\n\t"
"jnz 1b\n"
- : "=&r" (__c), "=&r" (__tmp), "=&r" (__d0)
+ : "=&r" (__c), "=&r" (__tmp), "=&r" (__d0),
+ "=m" ( *(struct { __extension__ char __x[__n]; } *)__s)
: "0" ((unsigned int) __c), "1" (__tmp), "2" (__n / 4)
- : "memory", "cc");
+ : "cc");
#endif
return __s;
}
("cld\n\t"
"rep; stosl\n"
"stosw"
- : "=&a" (__d0), "=&D" (__tmp), "=&c" (__d1)
+ : "=&a" (__d0), "=&D" (__tmp), "=&c" (__d1),
+ "=m" ( *(struct { __extension__ char __x[__n]; } *)__s)
: "0" ((unsigned int) __c), "1" (__tmp), "2" (__n / 4)
- : "memory", "cc");
+ : "cc");
#else
__asm__ __volatile__
("1:\tmovl %0,(%1)\n\t"
"decl %2\n\t"
"jnz 1b\n"
"movw %w0,(%1)"
- : "=&q" (__d0), "=&r" (__tmp), "=&r" (__d1)
+ : "=&q" (__d0), "=&r" (__tmp), "=&r" (__d1),
+ "=m" ( *(struct { __extension__ char __x[__n]; } *)__s)
: "0" ((unsigned int) __c), "1" (__tmp), "2" (__n / 4)
- : "memory", "cc");
+ : "cc");
#endif
return __s;
}
"addl $4,%1\n\t"
"decl %2\n\t"
"jnz 1b\n"
- : "=&q" (__c), "=&r" (__tmp), "=&r" (__d0)
+ : "=&q" (__c), "=&r" (__tmp), "=&r" (__d0),
+ "=m" ( *(struct { __extension__ char __x[__n]; } *)__s)
: "0" ((unsigned int) __c), "1" (__tmp), "2" (__n / 4)
- : "memory", "cc");
+ : "cc");
return __s;
}
"decl %2\n\t"
"jnz 1b\n"
"movw %w0,(%1)"
- : "=&q" (__d0), "=&r" (__tmp), "=&r" (__d1)
+ : "=&q" (__d0), "=&r" (__tmp), "=&r" (__d1),
+ "=m" ( *(struct { __extension__ char __x[__n]; } *)__s)
: "0" ((unsigned int) __c), "1" (__tmp), "2" (__n / 4)
- : "memory", "cc");
+ : "cc");
return __s;
}
"repne; scasb\n\t"
"cmovne %2,%0"
: "=D" (__res), "=&c" (__d0), "=&r" (__d1)
- : "a" (__c), "0" (__s), "1" (__n), "2" (1)
+ : "a" (__c), "0" (__s), "1" (__n), "2" (1),
+ "m" ( *(struct { __extension__ char __x[__n]; } *)__s)
: "cc");
#else
__asm__ __volatile__
"movl $1,%0\n"
"1:"
: "=D" (__res), "=&c" (__d0)
- : "a" (__c), "0" (__s), "1" (__n)
+ : "a" (__c), "0" (__s), "1" (__n),
+ "m" ( *(struct { __extension__ char __x[__n]; } *)__s)
: "cc");
#endif
return __res - 1;
"cmovne %2,%0\n\t"
"cld"
: "=D" (__res), "=&c" (__d0), "=&r" (__d1)
- : "a" (__c), "0" (__s + __n - 1), "1" (__n), "2" (-1)
+ : "a" (__c), "0" (__s + __n - 1), "1" (__n), "2" (-1),
+ "m" ( *(struct { __extension__ char __x[__n]; } *)__s)
: "cc");
# else
__asm__ __volatile__
"orl $-1,%0\n"
"1:\tcld"
: "=D" (__res), "=&c" (__d0)
- : "a" (__c), "0" (__s + __n - 1), "1" (__n)
+ : "a" (__c), "0" (__s + __n - 1), "1" (__n),
+ "m" ( *(struct { __extension__ char __x[__n]; } *)__s)
: "cc");
# endif
return __res + 1;
("cld\n\t"
"repne; scasb\n\t"
: "=D" (__res), "=&c" (__d0)
- : "a" (__c), "0" (__s), "1" (0xffffffff)
+ : "a" (__c), "0" (__s), "1" (0xffffffff),
+ "m" ( *(struct { char __x[0xfffffff]; } *)__s)
: "cc");
return __res - 1;
}
"testb %b1,%b1\n\t"
"jne 1b"
: "=r" (__tmp), "=&q" (__dummy)
- : "0" (__str)
- : "memory", "cc" );
+ : "0" (__str),
+ "m" ( *(struct { char __x[0xfffffff]; } *)__str)
+ : "cc" );
return __tmp - __str - 1;
}
"testb %b2,%b2\n\t"
"jne 1b"
: "=&r" (__src), "=&r" (__tmp), "=&q" (__dummy)
- : "0" (__src), "1" (__tmp)
- : "memory", "cc");
+ : "0" (__src), "1" (__tmp),
+ "m" ( *(struct { char __x[0xfffffff]; } *)__dest)
+ : "cc");
return __dest;
}
"leal 4(%1),%1\n\t"
"decl %3\n\t"
"jnz 1b"
- : "=&r" (__d0), "=r" (__tmp), "=&r" (__src), "=&r" (__d1)
- : "1" (__tmp), "2" (__src), "3" (__srclen / 4)
- : "memory", "cc");
+ : "=&r" (__d0), "=r" (__tmp), "=&r" (__src), "=&r" (__d1),
+ "=m" ( *(struct { __extension__ char __x[__srclen]; } *)__dest)
+ : "1" (__tmp), "2" (__src), "3" (__srclen / 4),
+ "m" ( *(struct { __extension__ char __x[__srclen]; } *)__src)
+ : "cc");
return __tmp;
}
"2:\n\t"
"movw (%2),%w0\n\t"
"movw %w0,(%1)"
- : "=&q" (__d0), "=r" (__tmp), "=&r" (__src), "=&r" (__d1)
- : "1" (__tmp), "2" (__src), "3" (__srclen / 2)
- : "memory", "cc");
+ : "=&q" (__d0), "=r" (__tmp), "=&r" (__src), "=&r" (__d1),
+ "=m" ( *(struct { __extension__ char __x[__srclen]; } *)__dest)
+ : "1" (__tmp), "2" (__src), "3" (__srclen / 2),
+ "m" ( *(struct { __extension__ char __x[__srclen]; } *)__src)
+ : "cc");
return __tmp + 2;
}
"movsw\n"
"2:\n\t"
"rep; movsl"
- : "=D" (__tmp), "=&c" (__d0), "=&S" (__d1)
- : "0" (__tmp), "1" (__srclen), "2" (__src)
- : "memory", "cc");
+ : "=D" (__tmp), "=&c" (__d0), "=&S" (__d1),
+ "=m" ( *(struct { __extension__ char __x[__srclen]; } *)__dest)
+ : "0" (__tmp), "1" (__srclen), "2" (__src),
+ "m" ( *(struct { __extension__ char __x[__srclen]; } *)__src)
+ : "cc");
return __tmp;
}
"leal 1(%1),%1\n\t"
"testb %b2,%b2\n\t"
"jne 1b"
- : "=&r" (__src), "=r" (__tmp), "=&q" (__dummy)
- : "0" (__src), "1" (__tmp)
- : "memory", "cc");
+ : "=&r" (__src), "=r" (__tmp), "=&q" (__dummy),
+ "=m" ( *(struct { char __x[0xfffffff]; } *)__dest)
+ : "0" (__src), "1" (__tmp),
+ "m" ( *(struct { char __x[0xfffffff]; } *)__src)
+ : "cc");
return __tmp - 1;
}
#endif
"leal 4(%1),%1\n\t"
"decl %3\n\t"
"jnz 1b"
- : "=&r" (__dummy1), "=r" (__tmp), "=&r" (__src), "=&r" (__dummy2)
- : "1" (__tmp), "2" (__src), "3" (__srclen / 4)
- : "memory", "cc");
+ : "=&r" (__dummy1), "=r" (__tmp), "=&r" (__src), "=&r" (__dummy2),
+ "=m" ( *(struct { __extension__ char __x[__srclen]; } *)__dest)
+ : "1" (__tmp), "2" (__src), "3" (__srclen / 4),
+ "m" ( *(struct { __extension__ char __x[__srclen]; } *)__src)
+ : "cc");
(void) memset (__tmp, '\0', __n - __srclen);
return __dest;
}
"2:\n\t"
"movw (%2),%w0\n\t"
"movw %w0,(%1)\n\t"
- : "=&q" (__dummy1), "=r" (__tmp), "=&r" (__src), "=&r" (__dummy2)
- : "1" (__tmp), "2" (__src), "3" (__srclen / 2)
- : "memory", "cc");
+ : "=&q" (__dummy1), "=r" (__tmp), "=&r" (__src), "=&r" (__dummy2),
+ "=m" ( *(struct { __extension__ char __x[__srclen]; } *)__dest)
+ : "1" (__tmp), "2" (__src), "3" (__srclen / 2),
+ "m" ( *(struct { __extension__ char __x[__srclen]; } *)__src)
+ : "cc");
(void) memset (__tmp + 2, '\0', __n - __srclen);
return __dest;
}
"movsw\n"
"2:\n\t"
"rep; movsl"
- : "=D" (__tmp), "=&c" (__d0), "=&S" (__d1)
- : "1" (__srclen), "0" (__tmp),"2" (__src)
- : "memory", "cc");
+ : "=D" (__tmp), "=&c" (__d0), "=&S" (__d1),
+ "=m" ( *(struct { __extension__ char __x[__srclen]; } *)__dest)
+ : "1" (__srclen), "0" (__tmp),"2" (__src),
+ "m" ( *(struct { __extension__ char __x[__srclen]; } *)__src)
+ : "cc");
(void) memset (__tmp, '\0', __n - __srclen);
return __dest;
}
register char *__tmp;
__asm__ __volatile__
("repne; scasb"
- : "=D" (__tmp), "=&c" (__d0)
- : "0" (__dest), "1" (0xffffffff), "a" (0)
+ : "=D" (__tmp), "=&c" (__d0),
+ "=m" ( *(struct { char __x[0xfffffff]; } *)__dest)
+ : "0" (__dest), "1" (0xffffffff), "a" (0),
+ "m" ( *(struct { __extension__ char __x[__srclen]; } *)__src)
: "cc");
--__tmp;
#else
"incl %0\n\t"
"cmpb $0,(%0)\n\t"
"jne 1b\n"
- : "=r" (__tmp)
- : "0" (__tmp)
+ : "=r" (__tmp),
+ "=m" ( *(struct { char __x[0xfffffff]; } *)__dest)
+ : "0" (__tmp),
+ "m" ( *(struct { __extension__ char __x[__srclen]; } *)__src)
: "cc");
#endif
(void) memcpy (__tmp, __src, __srclen);
"incl %1\n\t"
"testb %b0,%b0\n\t"
"jne 2b\n"
- : "=&q" (__dummy), "=&r" (__tmp), "=&r" (__src)
- : "1" (__tmp), "2" (__src)
+ : "=&q" (__dummy), "=&r" (__tmp), "=&r" (__src),
+ "=m" ( *(struct { char __x[0xfffffff]; } *)__dest)
+ : "1" (__tmp), "2" (__src),
+ "m" ( *(struct { char __x[0xfffffff]; } *)__src)
: "memory", "cc");
return __dest;
}
"negl %0\n"
"3:"
: "=q" (__res), "=&r" (__s1), "=&r" (__s2)
- : "1" (__s1), "2" (__s2)
+ : "1" (__s1), "2" (__s2),
+ "m" ( *(struct { char __x[0xfffffff]; } *)__s1),
+ "m" ( *(struct { char __x[0xfffffff]; } *)__s2)
: "cc");
return __res;
}
"negl %0\n"
"4:"
: "=q" (__res), "=&r" (__s1), "=&r" (__s2), "=&r" (__n)
- : "1" (__s1), "2" (__s2), "3" (__n)
+ : "1" (__s1), "2" (__s2), "3" (__n),
+ "m" ( *(struct { __extension__ char __x[__n]; } *)__s1),
+ "m" ( *(struct { __extension__ char __x[__n]; } *)__s2)
: "cc");
return __res;
}
"xorl %0,%0\n"
"2:"
: "=r" (__res), "=&a" (__d0)
- : "0" (__s), "1" (__c)
+ : "0" (__s), "1" (__c),
+ "m" ( *(struct { char __x[0xfffffff]; } *)__s)
: "cc");
return __res;
}
"xorl %0,%0\n"
"2:"
: "=r" (__res), "=&a" (__d0)
- : "0" (__s), "1" (__c)
+ : "0" (__s), "1" (__c),
+ "m" ( *(struct { char __x[0xfffffff]; } *)__s)
: "cc");
return __res;
}
"decl %0\n"
"2:"
: "=r" (__res), "=&a" (__d0)
- : "0" (__s), "1" (__c)
+ : "0" (__s), "1" (__c),
+ "m" ( *(struct { char __x[0xfffffff]; } *)__s)
: "cc");
return __res;
}
"decl %0\n"
"2:"
: "=r" (__res), "=&a" (__d0)
- : "0" (__s), "1" (__c)
+ : "0" (__s), "1" (__c),
+ "m" ( *(struct { char __x[0xfffffff]; } *)__s)
: "cc");
return __res;
}
"testb %b2,%b2\n\t"
"jne 1b"
: "=d" (__res), "=&S" (__d0), "=&a" (__d1)
- : "0" (1), "1" (__s), "2" (__c)
+ : "0" (1), "1" (__s), "2" (__c),
+ "m" ( *(struct { char __x[0xfffffff]; } *)__s)
: "cc");
return __res - 1;
}
"testb %b2,%b2\n\t"
"jne 1b"
: "=d" (__res), "=&S" (__d0), "=&a" (__d1)
- : "0" (1), "1" (__s), "2" (__c)
+ : "0" (1), "1" (__s), "2" (__c),
+ "m" ( *(struct { char __x[0xfffffff]; } *)__s)
: "cc");
return __res - 1;
}
"testb %%al,%%al\n\t"
"jne 1b"
: "=d" (__res), "=&S" (__d0), "=&a" (__d1)
- : "0" (0), "1" (__s), "2" (__c)
+ : "0" (0), "1" (__s), "2" (__c),
+ "m" ( *(struct { char __x[0xfffffff]; } *)__s)
: "cc");
return __res;
}
"testb %%al,%%al\n\t"
"jne 1b"
: "=r" (__res), "=&S" (__d0), "=&a" (__d1)
- : "0" (0), "1" (__s), "2" (__c)
+ : "0" (0), "1" (__s), "2" (__c),
+ "m" ( *(struct { char __x[0xfffffff]; } *)__s)
: "cc");
return __res;
}
"jne 1b\n"
"2:"
: "=r" (__res), "=&a" (__d0)
- : "0" (__s), "1" (__reject)
+ : "0" (__s), "1" (__reject),
+ "m" ( *(struct { char __x[0xfffffff]; } *)__s)
: "cc");
return (__res - 1) - __s;
}
"jne 1b\n"
"2:"
: "=S" (__res), "=&a" (__d0), "=&c" (__d1), "=&D" (__d2)
- : "0" (__s), "d" (__reject), "g" (__reject_len)
+ : "0" (__s), "d" (__reject), "g" (__reject_len),
+ "m" ( *(struct { char __x[0xfffffff]; } *)__s),
+ "m" ( *(struct { __extension__ char __x[__reject_len]; } *)__reject)
: "cc");
return (__res - 1) - __s;
}
"popl %%ebx"
: "=S" (__res), "=&a" (__d0), "=&c" (__d1), "=&D" (__d2)
: "r" (__reject), "0" (__s), "1" (0), "2" (0xffffffff)
- : "cc");
+ : "memory", "cc");
return (__res - 1) - __s;
}
#else
"2:"
: "=S" (__res), "=&a" (__d0), "=&c" (__d1), "=&D" (__d2), "=&d" (__d3)
: "0" (__s), "1" (0), "2" (0xffffffff), "3" (__reject), "b" (__reject)
- : "cc");
+ /* Clobber memory, otherwise GCC cannot handle this. */
+ : "memory", "cc");
return (__res - 1) - __s;
}
#endif
"cmpb %h1,%b1\n\t"
"je 1b"
: "=r" (__res), "=&q" (__d0)
- : "0" (__s), "1" (__accept)
+ : "0" (__s), "1" (__accept),
+ "m" ( *(struct { char __x[0xfffffff]; } *)__s)
: "cc");
return (__res - 1) - __s;
}
"je 1b\n"
"2:"
: "=S" (__res), "=&d" (__d0), "=&c" (__d1), "=&D" (__d2)
- : "0" (__s), "1" (__accept), "g" (__accept_len)
+ : "0" (__s), "1" (__accept), "g" (__accept_len),
+ "m" ( *(struct { char __x[0xfffffff]; } *)__s),
+ "m" ( *(struct { __extension__ char __x[__accept_len]; } *)__accept)
: "cc");
return (__res - 1) - __s;
}
"popl %%ebx"
: "=S" (__res), "=&a" (__d0), "=&c" (__d1), "=&D" (__d2)
: "d" (__accept), "0" (__s), "1" (0), "2" (0xffffffff), "3" (__accept)
- : "cc");
+ : "memory", "cc");
return (__res - 1) - __s;
}
#else
"2:"
: "=S" (__res), "=&a" (__d0), "=&c" (__d1), "=&D" (__d2), "=&d" (__d3)
: "0" (__s), "1" (0), "2" (0xffffffff), "3" (__accept), "b" (__accept)
- : "cc");
+ : "memory", "cc");
return (__res - 1) - __s;
}
#endif
"xorl %0,%0\n"
"3:"
: "=S" (__res), "=&a" (__d0), "=&c" (__d1), "=&D" (__d2)
- : "0" (__s), "d" (__accept), "g" (__accept_len)
+ : "0" (__s), "d" (__accept), "g" (__accept_len),
+ "m" ( *(struct { char __x[0xfffffff]; } *)__s),
+ "m" ( *(struct { __extension__ char __x[__accept_len]; } *)__accept)
: "cc");
return __res;
}
"popl %%ebx"
: "=S" (__res), "=&a" (__d0), "=&c" (__d1), "=&D" (__d2)
: "d" (__accept), "0" (__s), "1" (0), "2" (0xffffffff)
- : "cc");
+ : "memory", "cc");
return __res;
}
#else
"3:"
: "=S" (__res), "=&a" (__d0), "=&c" (__d1), "=&d" (__d2), "=&D" (__d3)
: "0" (__s), "1" (0), "2" (0xffffffff), "b" (__accept)
- : "cc");
+ : "memory", "cc");
return __res;
}
#endif
"xorl %%eax,%%eax\n"
"2:"
: "=a" (__res), "=&S" (__d0), "=&D" (__d1), "=&c" (__d2)
- : "g" (__needle_len), "1" (__haystack), "d" (__needle)
+ : "g" (__needle_len), "1" (__haystack), "d" (__needle),
+ /* Since we do not know how large the memory we access it, use a really large amount. */
+ "m" ( *(struct { char __x[0xfffffff]; } *)__haystack),
+ "m" ( *(struct { __extension__ char __x[__needle_len]; } *)__needle)
: "cc");
return __res;
}
: "=a" (__res), "=&c" (__d0), "=&S" (__d1), "=&D" (__d2)
: "0" (0), "1" (0xffffffff), "2" (__haystack), "3" (__needle),
"d" (__needle)
- : "cc");
+ : "memory", "cc");
return __res;
}
#else
: "=a" (__res), "=&c" (__d0), "=&S" (__d1), "=&D" (__d2), "=&d" (__d3)
: "0" (0), "1" (0xffffffff), "2" (__haystack), "3" (__needle),
"b" (__needle)
- : "cc");
+ : "memory", "cc");
return __res;
}
#endif