Index: libc/generic/string.c
===================================================================
--- libc/generic/string.c	(revision ad1239645b02708f7161264264d3ad376895704d)
+++ libc/generic/string.c	(revision 88c315148b0d6fc3b1a63c2a832ea0190a3367cc)
@@ -43,12 +43,33 @@
 }
 
-void * memcpy(void *dest, void *src, size_t n)
-{
-	char *os = src;
-	char *odst = dest;
-	while (n--)
-		*(odst++) = *(os++);
-	return dest;
-}
+void * memcpy(void *dst, const void *src, size_t n)
+{
+	int i, j;
+
+	for (i = 0; i < n/sizeof(unsigned long); i++)
+		((unsigned long *) dst)[i] = ((unsigned long *) src)[i];
+		
+	for (j = 0; j < n%sizeof(unsigned long); j++)
+		((unsigned char *)(((unsigned long *) dst) + i))[j] = ((unsigned char *)(((unsigned long *) src) + i))[j];
+		
+	return (char *)src;
+}
+
+void * memmove(void *dst, const void *src, size_t n)
+{
+	int i, j;
+	
+	if (src > dst)
+		return memcpy(dst, src, n);
+
+	for (j = (n%sizeof(unsigned long))-1; j >= 0; j--)
+		((unsigned char *)(((unsigned long *) dst) + i))[j] = ((unsigned char *)(((unsigned long *) src) + i))[j];
+
+	for (i = n/sizeof(unsigned long)-1; i >=0 ; i--)
+		((unsigned long *) dst)[i] = ((unsigned long *) src)[i];
+		
+	return (char *)src;
+}
+
 
 /** Count the number of characters in the string, not including terminating 0.
