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