summaryrefslogtreecommitdiffstats
path: root/c/src
diff options
context:
space:
mode:
authorJoel Sherrill <joel.sherrill@OARcorp.com>1998-06-12 21:12:12 +0000
committerJoel Sherrill <joel.sherrill@OARcorp.com>1998-06-12 21:12:12 +0000
commit773890639c8987212f7a3722fca23303b933bad7 (patch)
tree575479fd736cdd92cf824ddc03d8610d46e3072b /c/src
parentPatch from Eric Norum to avoid printing from context switch user extension. (diff)
downloadrtems-773890639c8987212f7a3722fca23303b933bad7.tar.bz2
Added optimized version of memcpy.c to this directory since RTEMS makes
important distinctions between CPU models which are not made by gcc. These distinctions help give us a more optimized memcpy(). This is important for message queues and KA9Q.
Diffstat (limited to 'c/src')
-rw-r--r--c/src/exec/score/cpu/m68k/Makefile.in2
-rw-r--r--c/src/exec/score/cpu/m68k/memcpy.c87
-rw-r--r--c/src/lib/libcpu/m68k/shared/misc/memcpy.c87
3 files changed, 175 insertions, 1 deletions
diff --git a/c/src/exec/score/cpu/m68k/Makefile.in b/c/src/exec/score/cpu/m68k/Makefile.in
index e95602eb98..d4ceea302e 100644
--- a/c/src/exec/score/cpu/m68k/Makefile.in
+++ b/c/src/exec/score/cpu/m68k/Makefile.in
@@ -11,7 +11,7 @@ PROJECT_ROOT = @PROJECT_ROOT@
RELS=$(ARCH)/rtems-cpu.rel
# C source names, if any, go here -- minus the .c
-C_PIECES=cpu
+C_PIECES=cpu memcpy
C_FILES=$(C_PIECES:%=%.c)
C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
diff --git a/c/src/exec/score/cpu/m68k/memcpy.c b/c/src/exec/score/cpu/m68k/memcpy.c
new file mode 100644
index 0000000000..3948411f4b
--- /dev/null
+++ b/c/src/exec/score/cpu/m68k/memcpy.c
@@ -0,0 +1,87 @@
+/*
+ * C library memcpy routine
+ *
+ * This routine has code to optimize performance on the CPU32+
+ * and another version for other 68k machines.
+ *
+ * It could be optimized more for machines with MOVE16 instructions.
+ *
+ * The routine is placed in this source directory to ensure that it
+ * is picked up by all applications.
+ *
+ * W. Eric Norum
+ * Saskatchewan Accelerator Laboratory
+ * University of Saskatchewan
+ * Saskatoon, Saskatchewan, CANADA
+ * eric@skatter.usask.ca
+ */
+
+#include <string.h>
+#include <rtems/score/m68k.h>
+
+#if defined(__mcpu32__)
+#define COPYSETUP(n) n--
+#define COPY(to,from,n,size) \
+ asm volatile ("1:\n" \
+ "\tmove." size " (%0)+,(%1)+\n" \
+ "\tdbf %2,1b\n" \
+ "\tsub.l #0x10000,%2\n" \
+ "\tbpl.b 1b\n" : \
+ "=a" (from), "=a" (to), "=d" (n) :\
+ "0" (from), "1" (to), "2" (n) : \
+ "cc", "memory")
+#else
+#define COPYSETUP(n)
+#define COPY(to,from,n,size) \
+ asm volatile ("1:\n" \
+ "\tmove." size " (%0)+,(%1)+\n" \
+ "\tsubq.l #1,%2\n\tbne.b 1b\n" : \
+ "=a" (from), "=a" (to), "=d" (n) :\
+ "0" (from), "1" (to), "2" (n) : \
+ "cc", "memory")
+#endif
+
+void *
+memcpy(void *s1, const void *s2, size_t n)
+{
+ char *p1 = s1;
+ const char *p2 = s2;
+
+ if (n) {
+ if (n < 16) {
+ COPYSETUP (n);
+ COPY (p1, p2, n, "b");
+ }
+ else {
+ int nbyte;
+ int nl;
+ nbyte = (int)p1 & 0x3;
+ if (nbyte) {
+ nbyte = 4 - nbyte;
+ n -= nbyte;
+ COPYSETUP (nbyte);
+ COPY (p1, p2, nbyte, "b");
+ }
+#if (M68K_HAS_MISALIGNED == 0)
+ /*
+ * Take care of machines that can't
+ * handle misaligned references.
+ */
+ if ((int)p2 & 0x1) {
+ COPYSETUP (n);
+ COPY (p1, p2, n, "b");
+ return s1;
+ }
+#endif
+ nl = (unsigned int)n >> 2;
+ COPYSETUP (nl);
+ COPY (p1, p2, nl, "l");
+ nbyte = (int)n & 0x3;
+ if (nbyte) {
+ COPYSETUP (nbyte);
+ COPY (p1, p2, nbyte, "b");
+ }
+ }
+ }
+ return s1;
+}
diff --git a/c/src/lib/libcpu/m68k/shared/misc/memcpy.c b/c/src/lib/libcpu/m68k/shared/misc/memcpy.c
new file mode 100644
index 0000000000..3948411f4b
--- /dev/null
+++ b/c/src/lib/libcpu/m68k/shared/misc/memcpy.c
@@ -0,0 +1,87 @@
+/*
+ * C library memcpy routine
+ *
+ * This routine has code to optimize performance on the CPU32+
+ * and another version for other 68k machines.
+ *
+ * It could be optimized more for machines with MOVE16 instructions.
+ *
+ * The routine is placed in this source directory to ensure that it
+ * is picked up by all applications.
+ *
+ * W. Eric Norum
+ * Saskatchewan Accelerator Laboratory
+ * University of Saskatchewan
+ * Saskatoon, Saskatchewan, CANADA
+ * eric@skatter.usask.ca
+ */
+
+#include <string.h>
+#include <rtems/score/m68k.h>
+
+#if defined(__mcpu32__)
+#define COPYSETUP(n) n--
+#define COPY(to,from,n,size) \
+ asm volatile ("1:\n" \
+ "\tmove." size " (%0)+,(%1)+\n" \
+ "\tdbf %2,1b\n" \
+ "\tsub.l #0x10000,%2\n" \
+ "\tbpl.b 1b\n" : \
+ "=a" (from), "=a" (to), "=d" (n) :\
+ "0" (from), "1" (to), "2" (n) : \
+ "cc", "memory")
+#else
+#define COPYSETUP(n)
+#define COPY(to,from,n,size) \
+ asm volatile ("1:\n" \
+ "\tmove." size " (%0)+,(%1)+\n" \
+ "\tsubq.l #1,%2\n\tbne.b 1b\n" : \
+ "=a" (from), "=a" (to), "=d" (n) :\
+ "0" (from), "1" (to), "2" (n) : \
+ "cc", "memory")
+#endif
+
+void *
+memcpy(void *s1, const void *s2, size_t n)
+{
+ char *p1 = s1;
+ const char *p2 = s2;
+
+ if (n) {
+ if (n < 16) {
+ COPYSETUP (n);
+ COPY (p1, p2, n, "b");
+ }
+ else {
+ int nbyte;
+ int nl;
+ nbyte = (int)p1 & 0x3;
+ if (nbyte) {
+ nbyte = 4 - nbyte;
+ n -= nbyte;
+ COPYSETUP (nbyte);
+ COPY (p1, p2, nbyte, "b");
+ }
+#if (M68K_HAS_MISALIGNED == 0)
+ /*
+ * Take care of machines that can't
+ * handle misaligned references.
+ */
+ if ((int)p2 & 0x1) {
+ COPYSETUP (n);
+ COPY (p1, p2, n, "b");
+ return s1;
+ }
+#endif
+ nl = (unsigned int)n >> 2;
+ COPYSETUP (nl);
+ COPY (p1, p2, nl, "l");
+ nbyte = (int)n & 0x3;
+ if (nbyte) {
+ COPYSETUP (nbyte);
+ COPY (p1, p2, nbyte, "b");
+ }
+ }
+ }
+ return s1;
+}