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