patch-2.0.21-2.1.0 linux/arch/m68k/lib/memcpy.c

Next file: linux/arch/m68k/lib/memset.c
Previous file: linux/arch/m68k/lib/Makefile
Back to the patch index
Back to the overall index

diff -u --recursive --new-file lx2.0/v2.0.21/linux/arch/m68k/lib/memcpy.c linux/arch/m68k/lib/memcpy.c
@@ -3,7 +3,7 @@
 void * memcpy(void * to, const void * from, size_t n)
 {
   void *xto = to;
-  size_t temp;
+  size_t temp, temp1;
 
   if (!n)
     return xto;
@@ -30,10 +30,30 @@
     {
       long *lto = to;
       const long *lfrom = from;
-      temp--;
-      do
-	*lto++ = *lfrom++;
-      while (temp--);
+
+      __asm__ __volatile__("movel %2,%3\n\t"
+			   "andw  #7,%3\n\t"
+			   "lsrl  #3,%2\n\t"
+			   "negw  %3\n\t"
+			   "jmp   %%pc@(1f,%3:w:2)\n\t"
+			   "4:\t"
+			   "movel %0@+,%1@+\n\t"
+			   "movel %0@+,%1@+\n\t"
+			   "movel %0@+,%1@+\n\t"
+			   "movel %0@+,%1@+\n\t"
+			   "movel %0@+,%1@+\n\t"
+			   "movel %0@+,%1@+\n\t"
+			   "movel %0@+,%1@+\n\t"
+			   "movel %0@+,%1@+\n\t"
+			   "1:\t"
+			   "dbra  %2,4b\n\t"
+			   "clrw  %2\n\t"
+			   "subql #1,%2\n\t"
+			   "jpl   4b\n\t"
+			   : "=a" (lfrom), "=a" (lto), "=d" (temp),
+			   "=&d" (temp1)
+			   : "0" (lfrom), "1" (lto), "2" (temp)
+			   );
       to = lto;
       from = lfrom;
     }

FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen, slshen@lbl.gov