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