aboutsummaryrefslogtreecommitdiff
path: root/sysdeps/i386/bits
diff options
context:
space:
mode:
Diffstat (limited to 'sysdeps/i386/bits')
-rw-r--r--sysdeps/i386/bits/string.h92
1 files changed, 52 insertions, 40 deletions
diff --git a/sysdeps/i386/bits/string.h b/sysdeps/i386/bits/string.h
index 1ea0571680..5f4f58a6db 100644
--- a/sysdeps/i386/bits/string.h
+++ b/sysdeps/i386/bits/string.h
@@ -54,59 +54,65 @@ __STRING_INLINE void *
__memcpy_c (void *__dest, __const void *__src, size_t __n)
{
register unsigned long int __d0, __d1, __d2;
+ union {
+ unsigned int __ui;
+ unsigned short int __usi;
+ unsigned char __uc;
+ } *__u = __dest;
switch (__n)
{
case 0:
return __dest;
case 1:
- *(unsigned char *) __dest = *(const unsigned char *) __src;
+ __u->__uc = *(const unsigned char *) __src;
return __dest;
case 2:
- *(unsigned short int *) __dest = *(const unsigned short int *) __src;
+ __u->__usi = *(const unsigned short int *) __src;
return __dest;
case 3:
- *(unsigned short int *) __dest = *(const unsigned short int *) __src;
- *(2 + (unsigned char *) __dest) = *(2 + (const unsigned char *) __src);
+ __u->__usi = *(const unsigned short int *) __src;
+ __u = (void *) __u + 2;
+ __u->__uc = *(2 + (const unsigned char *) __src);
return __dest;
case 4:
- *(unsigned long int *) __dest = *(const unsigned long int *) __src;
+ __u->__ui = *(const unsigned int *) __src;
return __dest;
- case 6: /* for ethernet addresses */
- *(unsigned long int *) __dest = *(const unsigned long int *) __src;
- *(2 + (unsigned short int *) __dest) =
- *(2 + (const unsigned short int *) __src);
+ case 6:
+ __u->__ui = *(const unsigned int *) __src;
+ __u = (void *) __u + 4;
+ __u->__usi = *(2 + (const unsigned short int *) __src);
return __dest;
case 8:
- *(unsigned long int *) __dest = *(const unsigned long int *) __src;
- *(1 + (unsigned long int *) __dest) =
- *(1 + (const unsigned long int *) __src);
+ __u->__ui = *(const unsigned int *) __src;
+ __u = (void *) __u + 4;
+ __u->__ui = *(1 + (const unsigned int *) __src);
return __dest;
case 12:
- *(unsigned long int *) __dest = *(const unsigned long int *) __src;
- *(1 + (unsigned long int *) __dest) =
- *(1 + (const unsigned long int *) __src);
- *(2 + (unsigned long int *) __dest) =
- *(2 + (const unsigned long int *) __src);
+ __u->__ui = *(const unsigned int *) __src;
+ __u = (void *) __u + 4;
+ __u->__ui = *(1 + (const unsigned int *) __src);
+ __u = (void *) __u + 4;
+ __u->__ui = *(2 + (const unsigned int *) __src);
return __dest;
case 16:
- *(unsigned long int *) __dest = *(const unsigned long int *) __src;
- *(1 + (unsigned long int *) __dest) =
- *(1 + (const unsigned long int *) __src);
- *(2 + (unsigned long int *) __dest) =
- *(2 + (const unsigned long int *) __src);
- *(3 + (unsigned long int *) __dest) =
- *(3 + (const unsigned long int *) __src);
+ __u->__ui = *(const unsigned int *) __src;
+ __u = (void *) __u + 4;
+ __u->__ui = *(1 + (const unsigned int *) __src);
+ __u = (void *) __u + 4;
+ __u->__ui = *(2 + (const unsigned int *) __src);
+ __u = (void *) __u + 4;
+ __u->__ui = *(3 + (const unsigned int *) __src);
return __dest;
case 20:
- *(unsigned long int *) __dest = *(const unsigned long int *) __src;
- *(1 + (unsigned long int *) __dest) =
- *(1 + (const unsigned long int *) __src);
- *(2 + (unsigned long int *) __dest) =
- *(2 + (const unsigned long int *) __src);
- *(3 + (unsigned long int *) __dest) =
- *(3 + (const unsigned long int *) __src);
- *(4 + (unsigned long int *) __dest) =
- *(4 + (const unsigned long int *) __src);
+ __u->__ui = *(const unsigned int *) __src;
+ __u = (void *) __u + 4;
+ __u->__ui = *(1 + (const unsigned int *) __src);
+ __u = (void *) __u + 4;
+ __u->__ui = *(2 + (const unsigned int *) __src);
+ __u = (void *) __u + 4;
+ __u->__ui = *(3 + (const unsigned int *) __src);
+ __u = (void *) __u + 4;
+ __u->__ui = *(4 + (const unsigned int *) __src);
return __dest;
}
#define __COMMON_CODE(x) \
@@ -115,7 +121,7 @@ __memcpy_c (void *__dest, __const void *__src, size_t __n)
"rep; movsl" \
x \
: "=&c" (__d0), "=&D" (__d1), "=&S" (__d2) \
- : "0" (__n / 4), "1" (__dest), "2" (__src) \
+ : "0" (__n / 4), "1" (&__u->__uc), "2" (__src) \
: "memory");
switch (__n % 4)
@@ -184,22 +190,28 @@ __STRING_INLINE void *
__memset_cc (void *__s, unsigned long int __pattern, size_t __n)
{
register unsigned long int __d0, __d1;
+ union {
+ unsigned int __ui;
+ unsigned short int __usi;
+ unsigned char __uc;
+ } *__u = __s;
switch (__n)
{
case 0:
return __s;
case 1:
- *(unsigned char *) __s = __pattern;
+ __u->__uc = __pattern;
return __s;
case 2:
- *(unsigned short int *) __s = __pattern;
+ __u->__usi = __pattern;
return __s;
case 3:
- *(unsigned short int *) __s = __pattern;
- *(2 + (unsigned char *) __s) = __pattern;
+ __u->__usi = __pattern;
+ __u = __extension__ ((void *) __u + 1);
+ __u->__uc = __pattern;
return __s;
case 4:
- *(unsigned long *) __s = __pattern;
+ __u->__ui = __pattern;
return __s;
}
#define __COMMON_CODE(x) \
@@ -208,7 +220,7 @@ __memset_cc (void *__s, unsigned long int __pattern, size_t __n)
"rep; stosl" \
x \
: "=&c" (__d0), "=&D" (__d1) \
- : "a" (__pattern), "0" (__n / 4), "1" (__s) \
+ : "a" (__pattern), "0" (__n / 4), "1" (&__u->__uc) \
: "memory")
switch (__n % 4)