Import 2.3.18pre1
[davej-history.git] / include / asm-sh / string.h
blob6752d3f9ca9435a3243eb1ee3cd323826818f2f7
1 #ifndef __ASM_SH_STRING_H
2 #define __ASM_SH_STRING_H
4 /*
5 * Copyright (C) 1999 Niibe Yutaka
6 * But consider these trivial functions to be public domain.
7 */
9 #define __HAVE_ARCH_STRCPY
10 extern __inline__ char *strcpy(char *__dest, const char *__src)
12 register char *__xdest = __dest;
13 unsigned long __dummy;
15 __asm__ __volatile__("1:\n\t"
16 "mov.b @%1+,%2\n\t"
17 "mov.b %2,@%0\n\t"
18 "cmp/eq #0,%2\n\t"
19 "bf/s 1b\n\t"
20 " add #1,%0\n\t"
21 :"=&r" (__dest), "=&r" (__src), "=&z" (__dummy)
22 :"0" (__dest), "1" (__src)
23 :"memory");
25 return __xdest;
28 #define __HAVE_ARCH_STRNCPY
29 extern __inline__ char *strncpy(char *__dest, const char *__src, size_t __n)
31 register char *__xdest = __dest;
32 unsigned long __dummy;
34 if (__n == 0)
35 return __xdest;
37 __asm__ __volatile__(
38 "1:\n"
39 "mov.b @%1+,%2\n\t"
40 "mov.b %2,@%0\n\t"
41 "cmp/eq #0,%2\n\t"
42 "bt/s 2f\n\t"
43 " cmp/eq %5,%1\n\t"
44 "bf/s 1b\n\t"
45 " add #1,%0\n"
46 "2:"
47 : "=r" (__dest), "=r" (__src), "=&z" (__dummy)
48 : "0" (__dest), "1" (__src), "r" (__src+__n)
49 : "memory");
51 return __xdest;
54 #define __HAVE_ARCH_STRCMP
55 extern __inline__ int strcmp(const char *__cs, const char *__ct)
57 register int __res;
58 unsigned long __dummy;
60 __asm__ __volatile__(
61 "mov.b @%1+,%3\n"
62 "1:\n\t"
63 "mov.b @%0+,%2\n\t"
64 "cmp/eq #0,%3\n\t"
65 "bt 2f\n\t"
66 "cmp/eq %2,%3\n\t"
67 "bt/s 1b\n\t"
68 " mov.b @%1+,%3\n\t"
69 "add #-2,%1\n\t"
70 "mov.b @%1,%3\n\t"
71 "sub %3,%2\n"
72 "2:"
73 : "=r" (__cs), "=r" (__ct), "=&r" (__res), "=&z" (__dummy)
74 : "0" (__cs), "1" (__ct));
76 return __res;
79 #define __HAVE_ARCH_STRNCMP
80 extern __inline__ int strncmp(const char *__cs, const char *__ct, size_t __n)
82 register int __res;
83 unsigned long __dummy;
85 __asm__ __volatile__(
86 "mov.b @%1+,%3\n"
87 "1:\n\t"
88 "mov.b @%0+,%2\n\t"
89 "cmp/eq %6,%0\n\t"
90 "bt/s 2f\n\t"
91 " cmp/eq #0,%3\n\t"
92 "bt/s 3f\n\t"
93 " cmp/eq %3,%2\n\t"
94 "bt/s 1b\n\t"
95 " mov.b @%1+,%3\n\t"
96 "add #-2,%1\n\t"
97 "mov.b @%1,%3\n"
98 "2:\n\t"
99 "sub %3,%2\n"
100 "3:"
101 :"=r" (__cs), "=r" (__ct), "=&r" (__res), "=&z" (__dummy)
102 : "0" (__cs), "1" (__ct), "r" (__cs+__n));
104 return __res;
107 #define __HAVE_ARCH_MEMSET
108 extern void *memset(void *__s, int __c, size_t __count);
110 #define __HAVE_ARCH_MEMCPY
111 extern void *memcpy(void *__to, __const__ void *__from, size_t __n);
113 #define __HAVE_ARCH_MEMMOVE
114 extern void *memmove(void *__dest, __const__ void *__src, size_t __n);
116 /* Don't build bcopy at all ... */
117 #define __HAVE_ARCH_BCOPY
119 #define __HAVE_ARCH_MEMSCAN
120 extern __inline__ void *memscan(void *__addr, int __c, size_t __size)
122 register char *__end;
123 unsigned long __dummy;
125 __asm__("mov #0,%2\n"
126 "1:\n\t"
127 "cmp/eq %0,%1\n\t"
128 "bt 2f\n\t"
129 "cmp/eq %5,%2\n\t"
130 "bf/s 1b\n\t"
131 " mov.b @%0+,%2\n\t"
132 "add #-1,%0\n\t"
133 "2:"
134 : "=r" (__addr), "=r" (__end), "=&z" (__dummy)
135 : "0" (__addr), "1" ((char *)__addr + __size), "r" (__c));
137 return __addr;
140 #endif /* __ASM_SH_STRING_H */