xref: /OK3568_Linux_fs/u-boot/arch/sh/include/asm/string.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun #ifndef __ASM_SH_STRING_H
2*4882a593Smuzhiyun #define __ASM_SH_STRING_H
3*4882a593Smuzhiyun 
4*4882a593Smuzhiyun /*
5*4882a593Smuzhiyun  * Copyright (C) 1999 Niibe Yutaka
6*4882a593Smuzhiyun  * But consider these trivial functions to be public domain.
7*4882a593Smuzhiyun  *
8*4882a593Smuzhiyun  * from linux kernel code.
9*4882a593Smuzhiyun  */
10*4882a593Smuzhiyun 
11*4882a593Smuzhiyun #ifdef __KERNEL__               /* only set these up for kernel code */
12*4882a593Smuzhiyun 
13*4882a593Smuzhiyun #define __HAVE_ARCH_STRCPY
strcpy(char * __dest,const char * __src)14*4882a593Smuzhiyun static inline char *strcpy(char *__dest, const char *__src)
15*4882a593Smuzhiyun {
16*4882a593Smuzhiyun 	register char *__xdest = __dest;
17*4882a593Smuzhiyun 	unsigned long __dummy;
18*4882a593Smuzhiyun 
19*4882a593Smuzhiyun 	__asm__ __volatile__("1:\n\t"
20*4882a593Smuzhiyun 			     "mov.b	@%1+, %2\n\t"
21*4882a593Smuzhiyun 			     "mov.b	%2, @%0\n\t"
22*4882a593Smuzhiyun 			     "cmp/eq	#0, %2\n\t"
23*4882a593Smuzhiyun 			     "bf/s	1b\n\t"
24*4882a593Smuzhiyun 			     " add	#1, %0\n\t"
25*4882a593Smuzhiyun 			     : "=r" (__dest), "=r" (__src), "=&z" (__dummy)
26*4882a593Smuzhiyun 			     : "0" (__dest), "1" (__src)
27*4882a593Smuzhiyun 			     : "memory", "t");
28*4882a593Smuzhiyun 
29*4882a593Smuzhiyun 	return __xdest;
30*4882a593Smuzhiyun }
31*4882a593Smuzhiyun 
32*4882a593Smuzhiyun #define __HAVE_ARCH_STRNCPY
strncpy(char * __dest,const char * __src,size_t __n)33*4882a593Smuzhiyun static inline char *strncpy(char *__dest, const char *__src, size_t __n)
34*4882a593Smuzhiyun {
35*4882a593Smuzhiyun 	register char *__xdest = __dest;
36*4882a593Smuzhiyun 	unsigned long __dummy;
37*4882a593Smuzhiyun 
38*4882a593Smuzhiyun 	if (__n == 0)
39*4882a593Smuzhiyun 		return __xdest;
40*4882a593Smuzhiyun 
41*4882a593Smuzhiyun 	__asm__ __volatile__(
42*4882a593Smuzhiyun 		"1:\n"
43*4882a593Smuzhiyun 		"mov.b	@%1+, %2\n\t"
44*4882a593Smuzhiyun 		"mov.b	%2, @%0\n\t"
45*4882a593Smuzhiyun 		"cmp/eq	#0, %2\n\t"
46*4882a593Smuzhiyun 		"bt/s	2f\n\t"
47*4882a593Smuzhiyun 		" cmp/eq	%5,%1\n\t"
48*4882a593Smuzhiyun 		"bf/s	1b\n\t"
49*4882a593Smuzhiyun 		" add	#1, %0\n"
50*4882a593Smuzhiyun 		"2:"
51*4882a593Smuzhiyun 		: "=r" (__dest), "=r" (__src), "=&z" (__dummy)
52*4882a593Smuzhiyun 		: "0" (__dest), "1" (__src), "r" (__src+__n)
53*4882a593Smuzhiyun 		: "memory", "t");
54*4882a593Smuzhiyun 
55*4882a593Smuzhiyun 	return __xdest;
56*4882a593Smuzhiyun }
57*4882a593Smuzhiyun 
58*4882a593Smuzhiyun #define __HAVE_ARCH_STRCMP
strcmp(const char * __cs,const char * __ct)59*4882a593Smuzhiyun static inline int strcmp(const char *__cs, const char *__ct)
60*4882a593Smuzhiyun {
61*4882a593Smuzhiyun 	register int __res;
62*4882a593Smuzhiyun 	unsigned long __dummy;
63*4882a593Smuzhiyun 
64*4882a593Smuzhiyun 	__asm__ __volatile__(
65*4882a593Smuzhiyun 		"mov.b	@%1+, %3\n"
66*4882a593Smuzhiyun 		"1:\n\t"
67*4882a593Smuzhiyun 		"mov.b	@%0+, %2\n\t"
68*4882a593Smuzhiyun 		"cmp/eq #0, %3\n\t"
69*4882a593Smuzhiyun 		"bt	2f\n\t"
70*4882a593Smuzhiyun 		"cmp/eq %2, %3\n\t"
71*4882a593Smuzhiyun 		"bt/s	1b\n\t"
72*4882a593Smuzhiyun 		" mov.b	@%1+, %3\n\t"
73*4882a593Smuzhiyun 		"add	#-2, %1\n\t"
74*4882a593Smuzhiyun 		"mov.b	@%1, %3\n\t"
75*4882a593Smuzhiyun 		"sub	%3, %2\n"
76*4882a593Smuzhiyun 		"2:"
77*4882a593Smuzhiyun 		: "=r" (__cs), "=r" (__ct), "=&r" (__res), "=&z" (__dummy)
78*4882a593Smuzhiyun 		: "0" (__cs), "1" (__ct)
79*4882a593Smuzhiyun 		: "t");
80*4882a593Smuzhiyun 
81*4882a593Smuzhiyun 	return __res;
82*4882a593Smuzhiyun }
83*4882a593Smuzhiyun 
84*4882a593Smuzhiyun #define __HAVE_ARCH_STRNCMP
strncmp(const char * __cs,const char * __ct,size_t __n)85*4882a593Smuzhiyun static inline int strncmp(const char *__cs, const char *__ct, size_t __n)
86*4882a593Smuzhiyun {
87*4882a593Smuzhiyun 	register int __res;
88*4882a593Smuzhiyun 	unsigned long __dummy;
89*4882a593Smuzhiyun 
90*4882a593Smuzhiyun 	if (__n == 0)
91*4882a593Smuzhiyun 		return 0;
92*4882a593Smuzhiyun 
93*4882a593Smuzhiyun 	__asm__ __volatile__(
94*4882a593Smuzhiyun 		"mov.b	@%1+, %3\n"
95*4882a593Smuzhiyun 		"1:\n\t"
96*4882a593Smuzhiyun 		"mov.b	@%0+, %2\n\t"
97*4882a593Smuzhiyun 		"cmp/eq %6, %0\n\t"
98*4882a593Smuzhiyun 		"bt/s	2f\n\t"
99*4882a593Smuzhiyun 		" cmp/eq #0, %3\n\t"
100*4882a593Smuzhiyun 		"bt/s	3f\n\t"
101*4882a593Smuzhiyun 		" cmp/eq %3, %2\n\t"
102*4882a593Smuzhiyun 		"bt/s	1b\n\t"
103*4882a593Smuzhiyun 		" mov.b	@%1+, %3\n\t"
104*4882a593Smuzhiyun 		"add	#-2, %1\n\t"
105*4882a593Smuzhiyun 		"mov.b	@%1, %3\n"
106*4882a593Smuzhiyun 		"2:\n\t"
107*4882a593Smuzhiyun 		"sub	%3, %2\n"
108*4882a593Smuzhiyun 		"3:"
109*4882a593Smuzhiyun 		:"=r" (__cs), "=r" (__ct), "=&r" (__res), "=&z" (__dummy)
110*4882a593Smuzhiyun 		: "0" (__cs), "1" (__ct), "r" (__cs+__n)
111*4882a593Smuzhiyun 		: "t");
112*4882a593Smuzhiyun 
113*4882a593Smuzhiyun 	return __res;
114*4882a593Smuzhiyun }
115*4882a593Smuzhiyun 
116*4882a593Smuzhiyun #undef __HAVE_ARCH_MEMSET
117*4882a593Smuzhiyun extern void *memset(void *__s, int __c, size_t __count);
118*4882a593Smuzhiyun 
119*4882a593Smuzhiyun #undef __HAVE_ARCH_MEMCPY
120*4882a593Smuzhiyun extern void *memcpy(void *__to, __const__ void *__from, size_t __n);
121*4882a593Smuzhiyun 
122*4882a593Smuzhiyun #undef __HAVE_ARCH_MEMMOVE
123*4882a593Smuzhiyun extern void *memmove(void *__dest, __const__ void *__src, size_t __n);
124*4882a593Smuzhiyun 
125*4882a593Smuzhiyun #undef __HAVE_ARCH_MEMCHR
126*4882a593Smuzhiyun extern void *memchr(const void *__s, int __c, size_t __n);
127*4882a593Smuzhiyun 
128*4882a593Smuzhiyun #undef __HAVE_ARCH_STRLEN
129*4882a593Smuzhiyun extern size_t strlen(const char *);
130*4882a593Smuzhiyun 
131*4882a593Smuzhiyun /* arch/sh/lib/strcasecmp.c */
132*4882a593Smuzhiyun extern int strcasecmp(const char *, const char *);
133*4882a593Smuzhiyun 
134*4882a593Smuzhiyun #else                           /* KERNEL */
135*4882a593Smuzhiyun 
136*4882a593Smuzhiyun /*
137*4882a593Smuzhiyun  * let user libraries deal with these,
138*4882a593Smuzhiyun  * IMHO the kernel has no place defining these functions for user apps
139*4882a593Smuzhiyun  */
140*4882a593Smuzhiyun 
141*4882a593Smuzhiyun #define __HAVE_ARCH_STRCPY      1
142*4882a593Smuzhiyun #define __HAVE_ARCH_STRNCPY     1
143*4882a593Smuzhiyun #define __HAVE_ARCH_STRCAT      1
144*4882a593Smuzhiyun #define __HAVE_ARCH_STRNCAT     1
145*4882a593Smuzhiyun #define __HAVE_ARCH_STRCMP      1
146*4882a593Smuzhiyun #define __HAVE_ARCH_STRNCMP     1
147*4882a593Smuzhiyun #define __HAVE_ARCH_STRNICMP    1
148*4882a593Smuzhiyun #define __HAVE_ARCH_STRCHR      1
149*4882a593Smuzhiyun #define __HAVE_ARCH_STRRCHR     1
150*4882a593Smuzhiyun #define __HAVE_ARCH_STRSTR      1
151*4882a593Smuzhiyun #define __HAVE_ARCH_STRLEN      1
152*4882a593Smuzhiyun #define __HAVE_ARCH_STRNLEN     1
153*4882a593Smuzhiyun #define __HAVE_ARCH_MEMSET      1
154*4882a593Smuzhiyun #define __HAVE_ARCH_MEMCPY      1
155*4882a593Smuzhiyun #define __HAVE_ARCH_MEMMOVE     1
156*4882a593Smuzhiyun #define __HAVE_ARCH_MEMSCAN     1
157*4882a593Smuzhiyun #define __HAVE_ARCH_MEMCMP      1
158*4882a593Smuzhiyun #define __HAVE_ARCH_MEMCHR      1
159*4882a593Smuzhiyun #define __HAVE_ARCH_STRTOK      1
160*4882a593Smuzhiyun 
161*4882a593Smuzhiyun #endif /* KERNEL */
162*4882a593Smuzhiyun #endif /* __ASM_SH_STRING_H */
163