summaryrefslogtreecommitdiffstats
path: root/include/asm-mips/string.h
diff options
context:
space:
mode:
Diffstat (limited to 'include/asm-mips/string.h')
-rw-r--r--include/asm-mips/string.h209
1 files changed, 209 insertions, 0 deletions
diff --git a/include/asm-mips/string.h b/include/asm-mips/string.h
new file mode 100644
index 000000000..06d4f2ce5
--- /dev/null
+++ b/include/asm-mips/string.h
@@ -0,0 +1,209 @@
+/*
+ * include/asm-mips/string.h
+ *
+ * This file is subject to the terms and conditions of the GNU General Public
+ * License. See the file "COPYING" in the main directory of this archive
+ * for more details.
+ *
+ * Copyright (c) 1994 by Ralf Baechle
+ */
+
+#ifndef _ASM_MIPS_STRING_H_
+#define _ASM_MIPS_STRING_H_
+
+#define __USE_PORTABLE_STRINGS_H_
+
+extern inline char * strcpy(char * dest,const char *src)
+{
+ char *xdest = dest;
+
+ __asm__ __volatile__(
+ ".set\tnoreorder\n\t"
+ ".set\tnoat\n"
+ "1:\tlbu\t$1,(%1)\n\t"
+ "addiu\t%1,%1,1\n\t"
+ "sb\t$1,(%0)\n\t"
+ "bne\t$0,$1,1b\n\t"
+ "addiu\t%0,%0,1\n\t"
+ ".set\tat\n\t"
+ ".set\treorder"
+ : "=d" (dest), "=d" (src)
+ : "0" (dest), "1" (src)
+ : "$1","memory");
+
+ return xdest;
+}
+
+extern inline char * strncpy(char *dest, const char *src, size_t n)
+{
+ char *xdest = dest;
+
+ if (n == 0)
+ return xdest;
+
+ __asm__ __volatile__(
+ ".set\tnoreorder\n\t"
+ ".set\tnoat\n"
+ "1:\tlbu\t$1,(%1)\n\t"
+ "addiu\t%2,%2,-1\n\t"
+ "sb\t$1,(%0)\n\t"
+ "beq\t$0,$1,2f\n\t"
+ "addiu\t%0,%0,1\n\t"
+ "bne\t$0,%2,1b\n\t"
+ "addiu\t%1,%1,1\n"
+ "2:\n\t"
+ ".set\tat\n\t"
+ ".set\treorder\n\t"
+ : "=d" (dest), "=d" (src), "=d" (n)
+ : "0" (dest), "1" (src), "2" (n)
+ : "$1","memory");
+
+ return dest;
+}
+
+#define __USE_PORTABLE_strcat
+#define __USE_PORTABLE_strncat
+
+extern inline int strcmp(const char * cs,const char * ct)
+{
+ int __res;
+
+ __asm__ __volatile__(
+ ".set\tnoreorder\n\t"
+ ".set\tnoat\n\t"
+ "lbu\t%2,(%0)\n"
+ "1:\tlbu\t$1,(%1)\n\t"
+ "addiu\t%0,%0,1\n\t"
+ "bne\t$1,%2,2f\n\t"
+ "addiu\t%1,%1,1\n\t"
+ "bne\t$0,%2,1b\n\t"
+ "lbu\t%2,(%0)\n"
+ "move\t%2,$1\n"
+ "2:\tsub\t%2,%2,$1\n"
+ "3:\t.set\tat\n\t"
+ ".set\treorder\n\t"
+ : "=d" (cs), "=d" (ct), "=d" (__res)
+ : "0" (cs), "1" (ct)
+ : "$1");
+
+ return __res;
+}
+
+extern inline int strncmp(const char * cs,const char * ct,size_t count)
+{
+ char __res;
+
+ __asm__ __volatile__(
+ ".set\tnoreorder\n\t"
+ ".set\tnoat\n"
+ "1:\tlbu\t%3,(%0)\n\t"
+ "beq\t$0,%2,2f\n\t"
+ "lbu\t$1,(%1)\n\t"
+ "addiu\t%2,%2,-1\n\t"
+ "bne\t$1,%3,3f\n\t"
+ "addiu\t%0,%0,1\n\t"
+ "bne\t$0,%3,1b\n\t"
+ "addiu\t%1,%1,1\n"
+ "2:\tmove\t%3,$1\n"
+ "3:\tsub\t%3,%3,$1\n\t"
+ ".set\tat\n\t"
+ ".set\treorder"
+ : "=d" (cs), "=d" (ct), "=d" (count), "=d" (__res)
+ : "0" (cs), "1" (ct), "2" (count)
+ : "$1");
+
+ return __res;
+}
+
+#define __USE_PORTABLE_strchr
+#define __USE_PORTABLE_strlen
+#define __USE_PORTABLE_strspn
+#define __USE_PORTABLE_strpbrk
+#define __USE_PORTABLE_strtok
+
+extern inline void * memset(void * s,char c,size_t count)
+{
+ void *xs = s;
+
+ if (!count)
+ return xs;
+ __asm__ __volatile__(
+ ".set\tnoreorder\n"
+ "1:\tsb\t%3,(%0)\n\t"
+ "addiu\t%1,%1,-1\n\t"
+ "bne\t$0,%1,1b\n\t"
+ "addiu\t%3,%3,1\n\t"
+ ".set\treorder"
+ : "=d" (s), "=d" (count)
+ : "0" (s), "d" (c), "1" (count)
+ : "memory");
+
+ return xs;
+}
+
+extern inline void * memcpy(void * to, const void * from, size_t n)
+{
+ void *xto = to;
+
+ if (!n)
+ return xto;
+ __asm__ __volatile__(
+ ".set\tnoreorder\n\t"
+ ".set\tnoat\n"
+ "1:\tlbu\t$1,(%1)\n\t"
+ "addiu\t%1,%1,1\n\t"
+ "sb\t$1,(%0)\n\t"
+ "addiu\t%2,%2,-1\n\t"
+ "bne\t$0,%2,1b\n\t"
+ "addiu\t%0,%0,1\n\t"
+ ".set\tat\n\t"
+ ".set\treorder"
+ : "=d" (to), "=d" (from), "=d" (n)
+ : "0" (to), "1" (from), "2" (n)
+ : "$1","memory" );
+ return xto;
+}
+
+extern inline void * memmove(void * dest,const void * src, size_t n)
+{
+ void *xdest = dest;
+
+ if (!n)
+ return xdest;
+
+ if (dest < src)
+ __asm__ __volatile__(
+ ".set\tnoreorder\n\t"
+ ".set\tnoat\n"
+ "1:\tlbu\t$1,(%1)\n\t"
+ "addiu\t%1,%1,1\n\t"
+ "sb\t$1,(%0)\n\t"
+ "addiu\t%2,%2,-1\n\t"
+ "bne\t$0,%2,1b\n\t"
+ "addiu\t%0,%0,1\n\t"
+ ".set\tat\n\t"
+ ".set\treorder"
+ : "=d" (dest), "=d" (src), "=d" (n)
+ : "0" (dest), "1" (src), "2" (n)
+ : "$1","memory" );
+ else
+ __asm__ __volatile__(
+ ".set\tnoreorder\n\t"
+ ".set\tnoat\n"
+ "1:\tlbu\t$1,-1(%1)\n\t"
+ "addiu\t%1,%1,-1\n\t"
+ "sb\t$1,-1(%0)\n\t"
+ "addiu\t%2,%2,-1\n\t"
+ "bne\t$0,%2,1b\n\t"
+ "addiu\t%0,%0,-1\n\t"
+ ".set\tat\n\t"
+ ".set\treorder"
+ : "=d" (dest), "=d" (src), "=d" (n)
+ : "0" (dest+n), "1" (src+n), "2" (n)
+ : "$1","memory" );
+ return xdest;
+}
+
+#define __USE_PORTABLE_memcmp
+
+#endif /* _ASM_MIPS_STRING_H_ */