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