diff options
author | kfraser@localhost.localdomain <kfraser@localhost.localdomain> | 2007-08-10 15:01:09 +0100 |
---|---|---|
committer | kfraser@localhost.localdomain <kfraser@localhost.localdomain> | 2007-08-10 15:01:09 +0100 |
commit | a7f5e0e87eea5ab29f36382d7e979dda80554ebb (patch) | |
tree | d0c10c4f88949c8f7a1d62fadb598cb4cb995a33 /xen/arch/x86/string.c | |
parent | b02c2e5dfcbd16b87263c8f3b328ab55f687ab95 (diff) | |
download | xen-a7f5e0e87eea5ab29f36382d7e979dda80554ebb.tar.gz xen-a7f5e0e87eea5ab29f36382d7e979dda80554ebb.tar.bz2 xen-a7f5e0e87eea5ab29f36382d7e979dda80554ebb.zip |
x86: Improved memcpy() asm implementation.
Signed-off-by: Jan Beulich <jbeulich@novell.com>
Diffstat (limited to 'xen/arch/x86/string.c')
-rw-r--r-- | xen/arch/x86/string.c | 22 |
1 files changed, 15 insertions, 7 deletions
diff --git a/xen/arch/x86/string.c b/xen/arch/x86/string.c index 745670b926..a649df9954 100644 --- a/xen/arch/x86/string.c +++ b/xen/arch/x86/string.c @@ -11,10 +11,18 @@ #undef memcpy void *memcpy(void *dest, const void *src, size_t n) { - int d0, d1, d2; + long d0, d1, d2; __asm__ __volatile__ ( - " rep ; movsl ; " +#ifdef __i386__ + " rep movsl ; " +#else + " rep movsq ; " + " testb $4,%b4 ; " + " je 0f ; " + " movsl ; " + "0: ; " +#endif " testb $2,%b4 ; " " je 1f ; " " movsw ; " @@ -23,7 +31,7 @@ void *memcpy(void *dest, const void *src, size_t n) " movsb ; " "2: " : "=&c" (d0), "=&D" (d1), "=&S" (d2) - : "0" (n/4), "q" (n), "1" (dest), "2" (src) + : "0" (n/sizeof(long)), "q" (n), "1" (dest), "2" (src) : "memory"); return dest; @@ -32,10 +40,10 @@ void *memcpy(void *dest, const void *src, size_t n) #undef memset void *memset(void *s, int c, size_t n) { - int d0, d1; + long d0, d1; __asm__ __volatile__ ( - "rep ; stosb" + "rep stosb" : "=&c" (d0), "=&D" (d1) : "a" (c), "1" (s), "0" (n) : "memory"); @@ -46,14 +54,14 @@ void *memset(void *s, int c, size_t n) #undef memmove void *memmove(void *dest, const void *src, size_t n) { - int d0, d1, d2; + long d0, d1, d2; if ( dest < src ) return memcpy(dest, src, n); __asm__ __volatile__ ( " std ; " - " rep ; movsb ; " + " rep movsb ; " " cld " : "=&c" (d0), "=&S" (d1), "=&D" (d2) : "0" (n), "1" (n-1+(const char *)src), "2" (n-1+(char *)dest) |