1#ifndef __ASM_SH_STRING_H
2#define __ASM_SH_STRING_H
3
4/*
5 * Copyright (C) 1999 Niibe Yutaka
6 * But consider these trivial functions to be public domain.
7 */
8
9#define __HAVE_ARCH_STRCPY
10static __inline__ char *strcpy(char *__dest, const char *__src)
11{
12	register char *__xdest = __dest;
13	unsigned long __dummy;
14
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", "t");
24
25	return __xdest;
26}
27
28#define __HAVE_ARCH_STRNCPY
29static __inline__ char *strncpy(char *__dest, const char *__src, size_t __n)
30{
31	register char *__xdest = __dest;
32	unsigned long __dummy;
33
34	if (__n == 0)
35		return __xdest;
36
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", "t");
50
51	return __xdest;
52}
53
54#define __HAVE_ARCH_STRCMP
55static __inline__ int strcmp(const char *__cs, const char *__ct)
56{
57	register int __res;
58	unsigned long __dummy;
59
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)
75		: "t");
76
77	return __res;
78}
79
80#define __HAVE_ARCH_STRNCMP
81static __inline__ int strncmp(const char *__cs, const char *__ct, size_t __n)
82{
83	register int __res;
84	unsigned long __dummy;
85
86	if (__n == 0)
87		return 0;
88
89	__asm__ __volatile__(
90		"mov.b	@%1+, %3\n"
91		"1:\n\t"
92		"mov.b	@%0+, %2\n\t"
93		"cmp/eq %6, %0\n\t"
94		"bt/s	2f\n\t"
95		" cmp/eq #0, %3\n\t"
96		"bt/s	3f\n\t"
97		" cmp/eq %3, %2\n\t"
98		"bt/s	1b\n\t"
99		" mov.b	@%1+, %3\n\t"
100		"add	#-2, %1\n\t"
101		"mov.b	@%1, %3\n"
102		"2:\n\t"
103		"sub	%3, %2\n"
104		"3:"
105		:"=r" (__cs), "=r" (__ct), "=&r" (__res), "=&z" (__dummy)
106		: "0" (__cs), "1" (__ct), "r" (__cs+__n)
107		: "t");
108
109	return __res;
110}
111
112#define __HAVE_ARCH_MEMSET
113extern void *memset(void *__s, int __c, size_t __count);
114
115#define __HAVE_ARCH_MEMCPY
116extern void *memcpy(void *__to, __const__ void *__from, size_t __n);
117
118#define __HAVE_ARCH_MEMMOVE
119extern void *memmove(void *__dest, __const__ void *__src, size_t __n);
120
121#define __HAVE_ARCH_MEMCHR
122extern void *memchr(const void *__s, int __c, size_t __n);
123
124#define __HAVE_ARCH_STRLEN
125extern size_t strlen(const char *);
126
127/* Don't build bcopy at all ...  */
128#define __HAVE_ARCH_BCOPY
129
130#endif /* __ASM_SH_STRING_H */
131