/root/src/xen/xen/arch/x86/string.c
Line | Count | Source |
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 | 897k | { |
12 | 897k | long d0, d1, d2; |
13 | 897k | |
14 | 897k | asm volatile ( |
15 | 897k | " rep ; movs"__OS" ; " |
16 | 897k | " mov %k4,%k3 ; " |
17 | 897k | " rep ; movsb " |
18 | 897k | : "=&c" (d0), "=&D" (d1), "=&S" (d2) |
19 | 897k | : "0" (n/BYTES_PER_LONG), "r" (n%BYTES_PER_LONG), "1" (dest), "2" (src) |
20 | 897k | : "memory" ); |
21 | 897k | |
22 | 897k | return dest; |
23 | 897k | } |
24 | | |
25 | | void *(memset)(void *s, int c, size_t n) |
26 | 108k | { |
27 | 108k | long d0, d1; |
28 | 108k | |
29 | 108k | asm volatile ( |
30 | 108k | "rep stosb" |
31 | 108k | : "=&c" (d0), "=&D" (d1) |
32 | 108k | : "a" (c), "1" (s), "0" (n) |
33 | 108k | : "memory"); |
34 | 108k | |
35 | 108k | return s; |
36 | 108k | } |
37 | | |
38 | | void *(memmove)(void *dest, const void *src, size_t n) |
39 | 273 | { |
40 | 273 | long d0, d1, d2; |
41 | 273 | |
42 | 273 | if ( unlikely(!n) ) |
43 | 15 | return dest; |
44 | 273 | |
45 | 258 | if ( dest < src ) |
46 | 251 | return memcpy(dest, src, n); |
47 | 258 | |
48 | 7 | asm volatile ( |
49 | 7 | " std ; " |
50 | 7 | " rep movsb ; " |
51 | 7 | " cld " |
52 | 7 | : "=&c" (d0), "=&S" (d1), "=&D" (d2) |
53 | 7 | : "0" (n), "1" (n-1+(const char *)src), "2" (n-1+(char *)dest) |
54 | 7 | : "memory"); |
55 | 7 | |
56 | 7 | return dest; |
57 | 258 | } |
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 | | */ |