Merge branch 'master' of git://www.denx.de/git/u-boot
[platform/kernel/u-boot.git] / include / asm-sh / string.h
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
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
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
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 #define __HAVE_ARCH_STRNCMP
85 static inline int strncmp(const char *__cs, const char *__ct, size_t __n)
86 {
87         register int __res;
88         unsigned long __dummy;
89
90         if (__n == 0)
91                 return 0;
92
93         __asm__ __volatile__(
94                 "mov.b  @%1+, %3\n"
95                 "1:\n\t"
96                 "mov.b  @%0+, %2\n\t"
97                 "cmp/eq %6, %0\n\t"
98                 "bt/s   2f\n\t"
99                 " cmp/eq #0, %3\n\t"
100                 "bt/s   3f\n\t"
101                 " cmp/eq %3, %2\n\t"
102                 "bt/s   1b\n\t"
103                 " mov.b @%1+, %3\n\t"
104                 "add    #-2, %1\n\t"
105                 "mov.b  @%1, %3\n"
106                 "2:\n\t"
107                 "sub    %3, %2\n"
108                 "3:"
109                 :"=r" (__cs), "=r" (__ct), "=&r" (__res), "=&z" (__dummy)
110                 : "0" (__cs), "1" (__ct), "r" (__cs+__n)
111                 : "t");
112
113         return __res;
114 }
115
116 #undef __HAVE_ARCH_MEMSET
117 extern void *memset(void *__s, int __c, size_t __count);
118
119 #undef __HAVE_ARCH_MEMCPY
120 extern void *memcpy(void *__to, __const__ void *__from, size_t __n);
121
122 #undef __HAVE_ARCH_MEMMOVE
123 extern void *memmove(void *__dest, __const__ void *__src, size_t __n);
124
125 #undef __HAVE_ARCH_MEMCHR
126 extern void *memchr(const void *__s, int __c, size_t __n);
127
128 #undef __HAVE_ARCH_STRLEN
129 extern size_t strlen(const char *);
130
131 /* arch/sh/lib/strcasecmp.c */
132 extern int strcasecmp(const char *, const char *);
133
134 #else                           /* KERNEL */
135
136 /*
137  * let user libraries deal with these,
138  * IMHO the kernel has no place defining these functions for user apps
139  */
140
141 #define __HAVE_ARCH_STRCPY      1
142 #define __HAVE_ARCH_STRNCPY     1
143 #define __HAVE_ARCH_STRCAT      1
144 #define __HAVE_ARCH_STRNCAT     1
145 #define __HAVE_ARCH_STRCMP      1
146 #define __HAVE_ARCH_STRNCMP     1
147 #define __HAVE_ARCH_STRNICMP    1
148 #define __HAVE_ARCH_STRCHR      1
149 #define __HAVE_ARCH_STRRCHR     1
150 #define __HAVE_ARCH_STRSTR      1
151 #define __HAVE_ARCH_STRLEN      1
152 #define __HAVE_ARCH_STRNLEN     1
153 #define __HAVE_ARCH_MEMSET      1
154 #define __HAVE_ARCH_MEMCPY      1
155 #define __HAVE_ARCH_MEMMOVE     1
156 #define __HAVE_ARCH_MEMSCAN     1
157 #define __HAVE_ARCH_MEMCMP      1
158 #define __HAVE_ARCH_MEMCHR      1
159 #define __HAVE_ARCH_STRTOK      1
160
161 #endif /* KERNEL */
162 #endif /* __ASM_SH_STRING_H */