1 /****************************************************************************** 2 * string.c 3 * 4 * These provide something for compiler-emitted string operations to link 5 * against. 6 */ 7 8 #include <xen/lib.h> 9 10 void *(memcpy)(void *dest, const void *src, size_t n) 11 { 12 long d0, d1, d2; 13 14 asm volatile ( 15 " rep ; movs"__OS" ; " 16 " mov %k4,%k3 ; " 17 " rep ; movsb " 18 : "=&c" (d0), "=&D" (d1), "=&S" (d2) 19 : "0" (n/BYTES_PER_LONG), "r" (n%BYTES_PER_LONG), "1" (dest), "2" (src) 20 : "memory" ); 21 22 return dest; 23 } 24 25 void *(memset)(void *s, int c, size_t n) 26 { 27 long d0, d1; 28 29 asm volatile ( 30 "rep stosb" 31 : "=&c" (d0), "=&D" (d1) 32 : "a" (c), "1" (s), "0" (n) 33 : "memory"); 34 35 return s; 36 } 37 38 void *(memmove)(void *dest, const void *src, size_t n) 39 { 40 long d0, d1, d2; 41 42 if ( unlikely(!n) ) 43 return dest; 44 45 if ( dest < src ) 46 return memcpy(dest, src, n); 47 48 asm volatile ( 49 " std ; " 50 " rep movsb ; " 51 " cld " 52 : "=&c" (d0), "=&S" (d1), "=&D" (d2) 53 : "0" (n), "1" (n-1+(const char *)src), "2" (n-1+(char *)dest) 54 : "memory"); 55 56 return dest; 57 } 58 59 /* 60 * Local variables: 61 * mode: C 62 * c-file-style: "BSD" 63 * c-basic-offset: 4 64 * tab-width: 4 65 * indent-tabs-mode: nil 66 * End: 67 */ 68