| 78 | } |
| 79 | |
| 80 | void *memcpy(void *dest, const void *src, size_t n) |
| 81 | { |
| 82 | unsigned long d0, d1, d2; |
| 83 | |
| 84 | #if CONFIG(LP_ARCH_X86_64) |
| 85 | asm volatile( |
| 86 | "rep ; movsq\n\t" |
| 87 | "mov %4,%%rcx\n\t" |
| 88 | "rep ; movsb\n\t" |
| 89 | : "=&c" (d0), "=&D" (d1), "=&S" (d2) |
| 90 | : "0" (n >> 3), "g" (n & 7), "1" (dest), "2" (src) |
| 91 | : "memory" |
| 92 | ); |
| 93 | #else |
| 94 | asm volatile( |
| 95 | "rep ; movsl\n\t" |
| 96 | "movl %4,%%ecx\n\t" |
| 97 | "rep ; movsb\n\t" |
| 98 | : "=&c" (d0), "=&D" (d1), "=&S" (d2) |
| 99 | : "0" (n >> 2), "g" (n & 3), "1" (dest), "2" (src) |
| 100 | : "memory" |
| 101 | ); |
| 102 | #endif |
| 103 | |
| 104 | return dest; |
| 105 | } |
| 106 | |
| 107 | void *memmove(void *dest, const void *src, size_t n) |
| 108 | { |
no outgoing calls