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