summaryrefslogtreecommitdiff
path: root/newlib/libc/machine/m68k/strcpy.c
diff options
context:
space:
mode:
Diffstat (limited to 'newlib/libc/machine/m68k/strcpy.c')
-rw-r--r--newlib/libc/machine/m68k/strcpy.c36
1 files changed, 36 insertions, 0 deletions
diff --git a/newlib/libc/machine/m68k/strcpy.c b/newlib/libc/machine/m68k/strcpy.c
new file mode 100644
index 00000000000..ccc914193d7
--- /dev/null
+++ b/newlib/libc/machine/m68k/strcpy.c
@@ -0,0 +1,36 @@
+/*
+ * C library strcpy routine
+ *
+ * This routine has been optimized for the CPU32+.
+ * It should run on all 68k machines.
+ *
+ * W. Eric Norum
+ * Saskatchewan Accelerator Laboratory
+ * University of Saskatchewan
+ * Saskatoon, Saskatchewan, CANADA
+ * eric@skatter.usask.ca
+ */
+
+#include <string.h>
+
+/*
+ * Copy bytes using CPU32+ loop mode if possible
+ */
+
+char *
+strcpy (char *to, const char *from)
+{
+ char *pto = to;
+ unsigned int n = 0xFFFF;
+
+ asm volatile ("1:\n"
+ "\tmove.b (%0)+,(%1)+\n"
+#if defined(__mcpu32__)
+ "\tdbeq %2,1b\n"
+#endif
+ "\tbne.b 1b\n" :
+ "=a" (from), "=a" (pto), "=d" (n) :
+ "0" (from), "1" (pto), "2" (n) :
+ "cc", "memory");
+ return to;
+}