From 90f1927f14e9cdbae37981af728af8e727838069 Mon Sep 17 00:00:00 2001
From: Peter Kjellerstedt <peter.kjellerstedt@axis.com>
Date: Wed, 21 Nov 2007 12:34:41 +0000
Subject: Added optimized versions of strcpy() and strncpy() for CRIS/CRISv32.

---
 libc/string/cris/strcpy.c  | 51 ++++++++++++++++++++++++++++++++++++++
 libc/string/cris/strncpy.c | 61 ++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 112 insertions(+)
 create mode 100644 libc/string/cris/strcpy.c
 create mode 100644 libc/string/cris/strncpy.c

diff --git a/libc/string/cris/strcpy.c b/libc/string/cris/strcpy.c
new file mode 100644
index 000000000..0af25253e
--- /dev/null
+++ b/libc/string/cris/strcpy.c
@@ -0,0 +1,51 @@
+/*
+ * Copyright (C) 2006-2007 Axis Communications AB
+ *
+ * Licensed under the LGPL v2.1, see the file COPYING.LIB in this tarball.
+ */
+
+#include <string.h>
+
+libc_hidden_proto(strcpy)
+char *strcpy(char *dest, const char *src)
+{
+  char *ret = dest;
+  unsigned long himagic = 0x80808080L;
+  unsigned long lomagic = 0x01010101L;
+
+  while ((unsigned long)src & (sizeof src - 1))
+  {
+    if (!(*dest++ = *src++))
+    {
+      return ret;
+    }
+  }
+
+  while (1)
+  {
+    unsigned long value = *(unsigned long*)src;
+    unsigned long magic;
+
+    src += sizeof (unsigned long);
+
+    if ((magic = (value - lomagic) & himagic))
+    {
+      if (magic & ~value)
+      {
+        break;
+      }
+    }
+
+    *(unsigned long*)dest = value;
+    dest += sizeof (unsigned long);
+  }
+
+  src -= sizeof (unsigned long);
+
+  while ((*dest++ = *src++))
+  {
+  }
+
+  return ret;
+}
+libc_hidden_def(strcpy)
diff --git a/libc/string/cris/strncpy.c b/libc/string/cris/strncpy.c
new file mode 100644
index 000000000..93a6608bc
--- /dev/null
+++ b/libc/string/cris/strncpy.c
@@ -0,0 +1,61 @@
+/*
+ * Copyright (C) 2006-2007 Axis Communications AB
+ *
+ * Licensed under the LGPL v2.1, see the file COPYING.LIB in this tarball.
+ */
+
+#include <string.h>
+
+libc_hidden_proto(memset)
+
+libc_hidden_proto(strncpy)
+char *strncpy(char *dest, const char *src, size_t count)
+{
+  char *ret = dest;
+  unsigned long himagic = 0x80808080L;
+  unsigned long lomagic = 0x01010101L;
+
+  while (count && (unsigned long)src & (sizeof src - 1))
+  {
+    count--;
+    if (!(*dest++ = *src++))
+    {
+      goto finalize;
+    }
+  }
+
+  while (count >= sizeof (unsigned long))
+  {
+    unsigned long value = *(unsigned long*)src;
+    unsigned long magic;
+
+    if ((magic = (value - lomagic) & himagic))
+    {
+      if (magic & ~value)
+      {
+        break;
+      }
+    }
+
+    *(unsigned long*)dest = value;
+    dest += sizeof (unsigned long);
+    src += sizeof (unsigned long);
+    count -= sizeof (unsigned long);
+  }
+
+  while (count)
+  {
+    count--;
+    if (!(*dest++ = *src++))
+      break;
+  }
+
+finalize:
+  if (count)
+  {
+    memset(dest, '\0', count);
+  }
+
+  return ret;
+}
+libc_hidden_def(strncpy)
-- 
cgit v1.2.3