about summary refs log tree commit diff
path: root/sysdeps/i386
diff options
context:
space:
mode:
Diffstat (limited to 'sysdeps/i386')
-rw-r--r--sysdeps/i386/bits/string.h186
1 files changed, 104 insertions, 82 deletions
diff --git a/sysdeps/i386/bits/string.h b/sysdeps/i386/bits/string.h
index c424306bcd..bf7d408cdc 100644
--- a/sysdeps/i386/bits/string.h
+++ b/sysdeps/i386/bits/string.h
@@ -48,6 +48,7 @@
 __STRING_INLINE void *
 __memcpy_c (void *__dest, __const void *__src, size_t __n)
 {
+  unsigned long int __d0, __d1, __d2;
   switch (__n)
     {
     case 0:
@@ -108,9 +109,9 @@ __memcpy_c (void *__dest, __const void *__src, size_t __n)
     ("cld\n\t"								      \
      "rep; movsl"							      \
      x									      \
-     : /* no outputs */							      \
-     : "c" (__n / 4), "D" (__dest), "S" (__src)				      \
-     : "cx", "di", "si", "memory");
+     : "=&c" (__d0), "=&D" (__d1), "=&S" (__d2)				      \
+     : "0" (__n / 4), "1" (__dest), "2" (__src)				      \
+     : "memory");
 
   switch (__n % 4)
     {
@@ -137,24 +138,25 @@ __memcpy_c (void *__dest, __const void *__src, size_t __n)
 __STRING_INLINE void *
 memmove (void *__dest, __const void *__src, size_t __n)
 {
+  unsigned long int __d0, __d1, __d2;
   if (__dest < __src)
     __asm__ __volatile__
       ("cld\n\t"
        "rep\n\t"
        "movsb"
-       : /* no output */
-       : "c" (__n), "S" (__src),"D" (__dest)
-       : "cx", "si", "di");
+       : "=&c" (__d0), "=&S" (__d1), "=&D" (__d2)
+       : "0" (__n), "1" (__src), "2" (__dest)
+       : "memory");
   else
     __asm__ __volatile__
       ("std\n\t"
        "rep\n\t"
        "movsb\n\t"
        "cld"
-       : /* no output */
-       : "c" (__n), "S" (__n - 1 + (const char *) __src),
-	 "D" (__n - 1 + (char *) __dest)
-       : "cx", "si", "di", "memory");
+       : "=&c" (__d0), "=&S" (__d1), "=&D" (__d2)
+       : "0" (__n), "1" (__n - 1 + (const char *) __src),
+	 "2" (__n - 1 + (char *) __dest)
+       : "memory");
   return __dest;
 }
 
@@ -171,6 +173,7 @@ memmove (void *__dest, __const void *__src, size_t __n)
 __STRING_INLINE void *
 __memset_cc (void *__s, unsigned long int __pattern, size_t __n)
 {
+  unsigned long int __d0, __d1;
   switch (__n)
     {
     case 0:
@@ -194,9 +197,9 @@ __memset_cc (void *__s, unsigned long int __pattern, size_t __n)
     ("cld\n\t"								      \
      "rep; stosl"							      \
      x									      \
-     : /* no outputs */							      \
-     : "a" (__pattern),"c" (__n / 4), "D" (__s)				      \
-     : "cx", "di", "memory")
+     : "=&c" (__d0), "=&D" (__d1)					      \
+     : "a" (__pattern),"0" (__n / 4), "1" (__s)				      \
+     : "memory")
 
   switch (__n % 4)
     {
@@ -219,32 +222,34 @@ __memset_cc (void *__s, unsigned long int __pattern, size_t __n)
 __STRING_INLINE void *
 __memset_cg (void *__s, unsigned long __c, size_t __n)
 {
+  unsigned long int __d0, __d1;
   __asm__ __volatile__
     ("cld\n\t"
      "rep; stosl\n\t"
-     "testb	$2,%b1\n\t"
+     "testb	$2,%b3\n\t"
      "je	1f\n\t"
      "stosw\n"
      "1:\n\t"
-     "testb	$1,%b1\n\t"
+     "testb	$1,%b3\n\t"
      "je	2f\n\t"
      "stosb\n"
      "2:"
-     : /* no output */
-     : "a" (__c), "q" (__n), "c" (__n / 4), "D" (__s)
-     : "cx", "di", "memory");
+     : "=&c" (__d0), "=&D" (__d1)
+     : "a" (__c), "q" (__n), "0" (__n / 4), "1" (__s)
+     : "memory");
   return __s;
 }
 
 __STRING_INLINE void *
 __memset_gg (void *__s, char __c, size_t __n)
 {
+  unsigned long int __d0, __d1;
   __asm__ __volatile__
     ("cld\n\t"
      "rep; stosb"
-     : /* no output */
-     : "a" (__c),"D" (__s), "c" (__n)
-     : "cx", "di", "memory");
+     : "=&D" (__d0), "=&c" (__d1)
+     : "a" (__c), "0" (__s), "1" (__n)
+     : "memory");
   return __s;
 }
 
@@ -256,6 +261,7 @@ __memset_gg (void *__s, char __c, size_t __n)
 __STRING_INLINE void *
 memchr (__const void *__s, int __c, size_t __n)
 {
+  unsigned long int __d0;
   register void *__res;
   if (count == 0)
     return NULL;
@@ -266,9 +272,8 @@ memchr (__const void *__s, int __c, size_t __n)
      "je	1f\n\t"
      "movl	$1,%0\n"
      "1:"
-     : "=D" (__res)
-     : "a" (__c), "0" (__s), "c" (__n)
-     : "cx");
+     : "=D" (__res), "=&c" (__d0)
+     : "a" (__c), "0" (__s), "1" (__n));
   return __res - 1;
 }
 
@@ -278,14 +283,15 @@ memchr (__const void *__s, int __c, size_t __n)
 __STRING_INLINE size_t
 strlen (__const char *__str)
 {
+  unsigned long int __d0;
   register size_t __res;
   __asm__ __volatile__
     ("cld\n\t"
      "repne; scasb\n\t"
      "notl %0"
-     : "=c" (__res)
-     : "D" (__str), "a" (0), "0" (0xffffffff)
-     : "di", "cc");
+     : "=c" (__res), "=&D" (__d0)
+     : "1" (__str), "a" (0), "0" (0xffffffff)
+     : "cc");
   return __res - 1;
 }
 
@@ -295,6 +301,7 @@ strlen (__const char *__str)
 __STRING_INLINE char *
 strcpy (char *__dest, __const char *__src)
 {
+  unsigned long int __d0, __d1;
   __asm__ __volatile__
     ("cld\n"
      "1:\n\t"
@@ -302,9 +309,9 @@ strcpy (char *__dest, __const char *__src)
      "stosb\n\t"
      "testb	%%al,%%al\n\t"
      "jne	1b"
-     : /* no output */
-     : "S" (__src), "D" (__dest)
-     : "si", "di", "ax", "memory", "cc");
+     : "=&S" (__d0), "=&D" (__d1)
+     : "0" (__src), "1" (__dest)
+     : "ax", "memory", "cc");
   return __dest;
 }
 
@@ -314,6 +321,7 @@ strcpy (char *__dest, __const char *__src)
 __STRING_INLINE char *
 strncpy (char *__dest, __const char *__src, size_t __n)
 {
+  unsigned long int __d0, __d1, __d2;
   __asm__ __volatile__
     ("cld\n"
      "1:\n\t"
@@ -325,9 +333,9 @@ strncpy (char *__dest, __const char *__src, size_t __n)
      "jne	1b\n\t"
      "rep; stosb\n"
      "2:"
-     : /* no output */
-     : "S" (__src), "D" (__dest), "c" (__n)
-     : "si", "di", "ax", "cx", "memory", "cc");
+     : "=&S" (__d0), "=&D" (__d1), "=&c" (__d2)
+     : "0" (__src), "1" (__dest), "2" (__n)
+     : "ax", "memory", "cc");
   return __dest;
 }
 
@@ -337,6 +345,7 @@ strncpy (char *__dest, __const char *__src, size_t __n)
 __STRING_INLINE char *
 strcat (char *__dest, __const char *__src)
 {
+  unsigned long int __d0, __d1, __d2, __d3;
   __asm__ __volatile__
     ("cld\n\t"
      "repne; scasb\n\t"
@@ -346,9 +355,9 @@ strcat (char *__dest, __const char *__src)
      "stosb\n\t"
      "testb	%%al,%%al\n\t"
      "jne	1b"
-     : /* no output */
-     : "S" (__src), "D" (__dest), "a" (0), "c" (0xffffffff)
-     : "si", "di", "ax", "cx", "memory", "cc");
+     : "=&S" (__d0), "=&D" (__d1), "=&c" (__d2), "=&a" (__d3)
+     : "0" (__src), "1" (__dest), "2" (0xffffffff), "3" (0)
+     : "memory", "cc");
   return __dest;
 }
 
@@ -358,11 +367,12 @@ strcat (char *__dest, __const char *__src)
 __STRING_INLINE char *
 strncat (char *__dest, __const char *__src, size_t __n)
 {
+  unsigned long int __d0, __d1, __d2, __d3;
   __asm__ __volatile__
     ("cld\n\t"
      "repne; scasb\n\t"
      "decl	%1\n\t"
-     "movl	%4,%3\n"
+     "movl	%5,%3\n"
      "1:\n\t"
      "decl	%3\n\t"
      "js	2f\n\t"
@@ -373,9 +383,9 @@ strncat (char *__dest, __const char *__src, size_t __n)
      "2:\n\t"
      "xorl	%2,%2\n\t"
      "stosb"
-     : /* no output */
-     : "S" (__src), "D" (__dest), "a" (0), "c" (0xffffffff), "g" (__n)
-     : "si", "di", "ax", "cx", "memory", "cc");
+     : "=&S" (__d0), "=&D" (__d1), "=&c" (__d2), "=&a" (__d3)
+     : "g" (__n), "0" (__src), "1" (__dest), "2" (0xffffffff), "3" (0)
+     : "memory", "cc");
   return __dest;
 }
 
@@ -385,6 +395,7 @@ strncat (char *__dest, __const char *__src, size_t __n)
 __STRING_INLINE int
 strcmp (__const char *__s1, __const char *__s2)
 {
+  unsigned long int __d0, __d1;
   register int __res;
   __asm__ __volatile__
     ("cld\n"
@@ -400,9 +411,9 @@ strcmp (__const char *__s1, __const char *__s2)
      "sbbl	%%eax,%%eax\n\t"
      "orb	$1,%%eax\n"
      "3:"
-     : "=a" (__res)
-     : "S" (__s1), "D" (__s2)
-     : "si", "di", "cc");
+     : "=a" (__res), "=&S" (__d0), "=&D" (__d1)
+     : "1" (__s1), "2" (__s2)
+     : "cc");
   return __res;
 }
 
@@ -412,6 +423,7 @@ strcmp (__const char *__s1, __const char *__s2)
 __STRING_INLINE int
 strncmp (__const char *__s1, __const char *__s2, size_t __n)
 {
+  unsigned long int __d0, __d1, __d2;
   register int __res;
   __asm__ __volatile__
     ("cld\n"
@@ -430,9 +442,9 @@ strncmp (__const char *__s1, __const char *__s2, size_t __n)
      "sbbl	%%eax,%%eax\n\t"
      "orb	$1,%%al\n"
      "4:"
-     : "=a" (__res)
-     : "S" (__s1), "D" (__s2), "c" (__n)
-     : "si", "di", "cx", "cc");
+     : "=a" (__res), "=&S" (__d0), "=&D" (__d1), "=&c" (__d2)
+     : "1" (__s1), "2" (__s2), "3" (__n)
+     : "cc");
   return __res;
 }
 
@@ -447,6 +459,7 @@ strncmp (__const char *__s1, __const char *__s2, size_t __n)
 __STRING_INLINE char *
 __strchr_g (__const char *__s, int __c)
 {
+  unsigned long int __d0;
   register char *__res;
   __asm__ __volatile__
     ("cld\n\t"
@@ -460,15 +473,16 @@ __strchr_g (__const char *__s, int __c)
      "movl	$1,%1\n"
      "2:\n\t"
      "movl	%1,%0"
-     : "=a" (__res)
-     : "S" (__s), "0" (__c)
-     : "si", "cc");
+     : "=a" (__res), "=&S" (__d0)
+     : "0" (__c), "1" (__s)
+     : "cc");
   return __res - 1;
 }
 
 __STRING_INLINE char *
 __strchr_c (__const char *__s, int __c)
 {
+  unsigned long int __d0;
   register char *__res;
   __asm__ __volatile__
     ("cld\n\t"
@@ -481,9 +495,9 @@ __strchr_c (__const char *__s, int __c)
      "movl	$1,%1\n"
      "2:\n\t"
      "movl	%1,%0"
-     : "=a" (__res)
-     : "S" (__s), "0" (__c)
-     : "si", "cc");
+     : "=a" (__res), "=&S" (__d0)
+     : "0" (__c), "1" (__s)
+     : "cc");
   return __res - 1;
 }
 
@@ -495,6 +509,7 @@ __strchr_c (__const char *__s, int __c)
 __STRING_INLINE size_t
 strcspn (__const char *__s, __const char *__reject)
 {
+  unsigned long int __d0, __d1, __d2;
   register char *__res;
   __asm__ __volatile__
     ("pushl	%%ebx\n\t"
@@ -514,19 +529,20 @@ strcspn (__const char *__s, __const char *__reject)
      "jne	1b\n"
      "2:\n\t"
      "popl	%%ebx"
-     : "=S" (__res)
-     : "a" (0), "c" (0xffffffff), "0" (__s), "r" (__reject)
-     : "ax", "cx", "di", "cc");
+     : "=&S" (__res), "=&a" (__d0), "=&c" (__d1), "=&D" (__d2)
+     : "r" (__reject), "1" (0), "2" (0xffffffff), "3" (__s),
+     : "cc");
   return (__res - 1) - __s;
 }
 #else
 __STRING_INLINE size_t
 strcspn (__const char *__s, __const char *__reject)
 {
+  unsigned long int __d0, __d1, __d2, __d3;
   register char *__res;
   __asm__ __volatile__
     ("cld\n\t"
-     "movl	%4,%%edi\n\t"
+     "movl	%5,%%edi\n\t"
      "repne; scasb\n\t"
      "notl	%%ecx\n\t"
      "decl	%%ecx\n\t"
@@ -535,14 +551,14 @@ strcspn (__const char *__s, __const char *__reject)
      "lodsb\n\t"
      "testb	%%al,%%al\n\t"
      "je	2f\n\t"
-     "movl	%4,%%edi\n\t"
+     "movl	%5,%%edi\n\t"
      "movl	%%edx,%%ecx\n\t"
      "repne; scasb\n\t"
      "jne	1b\n"
      "2:"
-     : "=S" (__res)
-     : "a" (0), "c" (0xffffffff),"0" (__s), "g" (__reject)
-     : "ax", "cx", "dx", "di", "cc");
+     : "=&S" (__res), "=&a" (__d0), "=&c" (__d1), "=&d" (__d2), "=&D" (__d3)
+     : "g" (__reject), "0" (__s), "1" (0), "2" (0xffffffff)
+     : "cc");
   return (__res - 1) - __s;
 }
 #endif
@@ -555,6 +571,7 @@ strcspn (__const char *__s, __const char *__reject)
 __STRING_INLINE size_t
 strspn (__const char *__s, __const char *__accept)
 {
+  unsigned long int __d0, __d1, __d2;
   register char *__res;
   __asm__ __volatile__
     ("pushl	%%ebx\n\t"
@@ -574,19 +591,20 @@ strspn (__const char *__s, __const char *__accept)
      "je	1b\n"
      "2:\n\t"
      "popl	%%ebx"
-     : "=S" (__res)
-     : "a" (0), "c" (0xffffffff), "0" (__s), "r" (__accept)
-     : "ax", "cx", "di", "cc");
+     : "=&S" (__res), "=&a" (__d0), "=&c" (__d1), "=&D" (__d2)
+     : "r" (__accept), "0" (__s), "1" (0), "2" (0xffffffff)
+     : "cc");
   return (__res - 1) - __s;
 }
 #else
 __STRING_INLINE size_t
 strspn (__const char *__s, __const char *__accept)
 {
+  unsigned long int __d0, __d1, __d2, __d3;
   register char *__res;
   __asm__ __volatile__
     ("cld\n\t"
-     "movl	%4,%%edi\n\t"
+     "movl	%5,%%edi\n\t"
      "repne; scasb\n\t"
      "notl	%%ecx\n\t"
      "decl	%%ecx\n\t"
@@ -595,14 +613,14 @@ strspn (__const char *__s, __const char *__accept)
      "lodsb\n\t"
      "testb	%%al,%%al\n\t"
      "je	2f\n\t"
-     "movl	%4,%%edi\n\t"
+     "movl	%5,%%edi\n\t"
      "movl	%%edx,%%ecx\n\t"
      "repne; scasb\n\t"
      "je	1b\n"
      "2:"
-     : "=S" (__res)
-     : "a" (0), "c" (0xffffffff), "0" (__s), "g" (__accept)
-     : "ax", "cx", "dx", "di", "cc");
+     : "=&S" (__res), "=&a" (__d0), "=&c" (__d1), "=&d" (__d2), "=&D" (__d3)
+     : "g" (__accept), "0" (__s), "a" (0), "c" (0xffffffff)
+     : "cc");
   return (__res - 1) - __s;
 }
 #endif
@@ -614,6 +632,7 @@ strspn (__const char *__s, __const char *__accept)
 __STRING_INLINE char *
 strpbrk (__const char *__s, __const char *__accept)
 {
+  unsigned long int __d0, __d1, __d2;
   register char *__res;
   __asm__ __volatile__
     ("pushl	%%ebx\n\t"
@@ -637,15 +656,16 @@ strpbrk (__const char *__s, __const char *__accept)
      "xorl	%0,%0\n"
      "3:\n\t"
      "popl	%%ebx"
-     : "=S" (__res)
-     : "a" (0), "c" (0xffffffff), "0" (__s), "r" (__accept)
-     : "ax", "cx", "di", "cc");
+     : "=&S" (__res), "=&a" (__d0), "=&c" (__d1), "=&D" (__d2)
+     : "r" (__accept), "0" (__s), "1" (0), "2" (0xffffffff)
+     : "cc");
   return __res;
 }
 #else
 __STRING_INLINE char *
 strpbrk (__const char *__s, __const char *__accept)
 {
+  unsigned long int __d0, __d1, __d2, __d3;
   register char *__res;
   __asm__ __volatile__
     ("cld\n\t"
@@ -667,9 +687,9 @@ strpbrk (__const char *__s, __const char *__accept)
      "2:\n\t"
      "xorl	%0,%0\n"
      "3:"
-     : "=S" (__res)
-     : "a" (0), "c" (0xffffffff), "0" (__s), "g" (__accept)
-     : "ax", "cx", "dx", "di", "cc");
+     : "=&S" (__res), "=&a" (__d0), "=&c" (__d1), "=&d" (__d2), "=&D" (__d3)
+     : "g" (__accept), "0" (__s), "1" (0), "2" (0xffffffff)
+     : "cc");
   return __res;
 }
 #endif
@@ -681,6 +701,7 @@ strpbrk (__const char *__s, __const char *__accept)
 __STRING_INLINE char *
 strstr (__const char *__haystack, __const char *__needle)
 {
+  unsigned long int __d0, __d1, __d2, __d3;
   register char *__res;
   __asm__ __volatile__
     ("pushl	%%ebx\n\t"
@@ -703,25 +724,26 @@ strstr (__const char *__haystack, __const char *__needle)
      "xorl	%%eax,%%eax\n\t"
      "2:\n\t"
      "popl	%%ebx"
-     : "=a" (__res)
-     : "0" (0), "c" (0xffffffff), "S" (__haystack), "r" (__needle)
-     : "cx", "di", "si", "cc");
+     : "=&a" (__res), "=&c" (__d0), "=&S" (__d1), "=&D" (__d2)
+     : "r" (__needle), "0" (0), "1" (0xffffffff), "2" (__haystack)
+     : "cc");
   return __res;
 }
 #else
 __STRING_INLINE char *
 strstr (__const char *__haystack, __const char *__needle)
 {
+  unsigned long int __d0, __d1, __d2, __d3;
   register char *__res;
   __asm__ __volatile__
     ("cld\n\t" \
-     "movl	%4,%%edi\n\t"
+     "movl	%5,%%edi\n\t"
      "repne; scasb\n\t"
      "notl	%%ecx\n\t"
      "decl	%%ecx\n\t"	/* NOTE! This also sets Z if searchstring='' */
      "movl	%%ecx,%%edx\n"
      "1:\n\t"
-     "movl	%4,%%edi\n\t"
+     "movl	%5,%%edi\n\t"
      "movl	%%esi,%%eax\n\t"
      "movl	%%edx,%%ecx\n\t"
      "repe; cmpsb\n\t"
@@ -732,9 +754,9 @@ strstr (__const char *__haystack, __const char *__needle)
      "jne	1b\n\t"
      "xorl	%%eax,%%eax\n\t"
      "2:"
-     : "=a" (__res)
-     : "0" (0), "c" (0xffffffff), "S" (__haystack), "g" (__needle)
-     : "cx", "dx", "di", "si", "cc");
+     : "=&a" (__res), "=&c" (__d0), "=&S" (__d1), "=&d" (__d2), "=&D" (__d3)
+     : "g" (__needle), "0" (0), "1" (0xffffffff), "2" (__haystack)
+     : "cc");
   return __res;
 }
 #endif