• Home
  • History
  • Annotate
  • Line#
  • Navigate
  • Raw
  • Download
  • only in /asuswrt-rt-n18u-9.0.0.4.380.2695/release/src-rt-6.x.4708/linux/linux-2.6/arch/m68k/lib/
1/*
2 * This file is subject to the terms and conditions of the GNU General Public
3 * License.  See the file COPYING in the main directory of this archive
4 * for more details.
5 */
6
7#define __IN_STRING_C
8
9#include <linux/module.h>
10#include <linux/string.h>
11
12char *strcpy(char *dest, const char *src)
13{
14	return __kernel_strcpy(dest, src);
15}
16EXPORT_SYMBOL(strcpy);
17
18char *strcat(char *dest, const char *src)
19{
20	return __kernel_strcpy(dest + __kernel_strlen(dest), src);
21}
22EXPORT_SYMBOL(strcat);
23
24void *memset(void *s, int c, size_t count)
25{
26	void *xs = s;
27	size_t temp, temp1;
28
29	if (!count)
30		return xs;
31	c &= 0xff;
32	c |= c << 8;
33	c |= c << 16;
34	if ((long)s & 1) {
35		char *cs = s;
36		*cs++ = c;
37		s = cs;
38		count--;
39	}
40	if (count > 2 && (long)s & 2) {
41		short *ss = s;
42		*ss++ = c;
43		s = ss;
44		count -= 2;
45	}
46	temp = count >> 2;
47	if (temp) {
48		long *ls = s;
49
50		asm volatile (
51			"	movel %1,%2\n"
52			"	andw  #7,%2\n"
53			"	lsrl  #3,%1\n"
54			"	negw  %2\n"
55			"	jmp   %%pc@(2f,%2:w:2)\n"
56			"1:	movel %3,%0@+\n"
57			"	movel %3,%0@+\n"
58			"	movel %3,%0@+\n"
59			"	movel %3,%0@+\n"
60			"	movel %3,%0@+\n"
61			"	movel %3,%0@+\n"
62			"	movel %3,%0@+\n"
63			"	movel %3,%0@+\n"
64			"2:	dbra  %1,1b\n"
65			"	clrw  %1\n"
66			"	subql #1,%1\n"
67			"	jpl   1b"
68			: "=a" (ls), "=d" (temp), "=&d" (temp1)
69			: "d" (c), "0" (ls), "1" (temp));
70		s = ls;
71	}
72	if (count & 2) {
73		short *ss = s;
74		*ss++ = c;
75		s = ss;
76	}
77	if (count & 1) {
78		char *cs = s;
79		*cs = c;
80	}
81	return xs;
82}
83EXPORT_SYMBOL(memset);
84
85void *memcpy(void *to, const void *from, size_t n)
86{
87	void *xto = to;
88	size_t temp, temp1;
89
90	if (!n)
91		return xto;
92	if ((long)to & 1) {
93		char *cto = to;
94		const char *cfrom = from;
95		*cto++ = *cfrom++;
96		to = cto;
97		from = cfrom;
98		n--;
99	}
100	if (n > 2 && (long)to & 2) {
101		short *sto = to;
102		const short *sfrom = from;
103		*sto++ = *sfrom++;
104		to = sto;
105		from = sfrom;
106		n -= 2;
107	}
108	temp = n >> 2;
109	if (temp) {
110		long *lto = to;
111		const long *lfrom = from;
112
113		asm volatile (
114			"	movel %2,%3\n"
115			"	andw  #7,%3\n"
116			"	lsrl  #3,%2\n"
117			"	negw  %3\n"
118			"	jmp   %%pc@(1f,%3:w:2)\n"
119			"4:	movel %0@+,%1@+\n"
120			"	movel %0@+,%1@+\n"
121			"	movel %0@+,%1@+\n"
122			"	movel %0@+,%1@+\n"
123			"	movel %0@+,%1@+\n"
124			"	movel %0@+,%1@+\n"
125			"	movel %0@+,%1@+\n"
126			"	movel %0@+,%1@+\n"
127			"1:	dbra  %2,4b\n"
128			"	clrw  %2\n"
129			"	subql #1,%2\n"
130			"	jpl   4b"
131			: "=a" (lfrom), "=a" (lto), "=d" (temp), "=&d" (temp1)
132			: "0" (lfrom), "1" (lto), "2" (temp));
133		to = lto;
134		from = lfrom;
135	}
136	if (n & 2) {
137		short *sto = to;
138		const short *sfrom = from;
139		*sto++ = *sfrom++;
140		to = sto;
141		from = sfrom;
142	}
143	if (n & 1) {
144		char *cto = to;
145		const char *cfrom = from;
146		*cto = *cfrom;
147	}
148	return xto;
149}
150EXPORT_SYMBOL(memcpy);
151
152void *memmove(void *dest, const void *src, size_t n)
153{
154	void *xdest = dest;
155	size_t temp;
156
157	if (!n)
158		return xdest;
159
160	if (dest < src) {
161		if ((long)dest & 1) {
162			char *cdest = dest;
163			const char *csrc = src;
164			*cdest++ = *csrc++;
165			dest = cdest;
166			src = csrc;
167			n--;
168		}
169		if (n > 2 && (long)dest & 2) {
170			short *sdest = dest;
171			const short *ssrc = src;
172			*sdest++ = *ssrc++;
173			dest = sdest;
174			src = ssrc;
175			n -= 2;
176		}
177		temp = n >> 2;
178		if (temp) {
179			long *ldest = dest;
180			const long *lsrc = src;
181			temp--;
182			do
183				*ldest++ = *lsrc++;
184			while (temp--);
185			dest = ldest;
186			src = lsrc;
187		}
188		if (n & 2) {
189			short *sdest = dest;
190			const short *ssrc = src;
191			*sdest++ = *ssrc++;
192			dest = sdest;
193			src = ssrc;
194		}
195		if (n & 1) {
196			char *cdest = dest;
197			const char *csrc = src;
198			*cdest = *csrc;
199		}
200	} else {
201		dest = (char *)dest + n;
202		src = (const char *)src + n;
203		if ((long)dest & 1) {
204			char *cdest = dest;
205			const char *csrc = src;
206			*--cdest = *--csrc;
207			dest = cdest;
208			src = csrc;
209			n--;
210		}
211		if (n > 2 && (long)dest & 2) {
212			short *sdest = dest;
213			const short *ssrc = src;
214			*--sdest = *--ssrc;
215			dest = sdest;
216			src = ssrc;
217			n -= 2;
218		}
219		temp = n >> 2;
220		if (temp) {
221			long *ldest = dest;
222			const long *lsrc = src;
223			temp--;
224			do
225				*--ldest = *--lsrc;
226			while (temp--);
227			dest = ldest;
228			src = lsrc;
229		}
230		if (n & 2) {
231			short *sdest = dest;
232			const short *ssrc = src;
233			*--sdest = *--ssrc;
234			dest = sdest;
235			src = ssrc;
236		}
237		if (n & 1) {
238			char *cdest = dest;
239			const char *csrc = src;
240			*--cdest = *--csrc;
241		}
242	}
243	return xdest;
244}
245EXPORT_SYMBOL(memmove);
246
247int memcmp(const void *cs, const void *ct, size_t count)
248{
249	const unsigned char *su1, *su2;
250
251	for (su1 = cs, su2 = ct; count > 0; ++su1, ++su2, count--)
252		if (*su1 != *su2)
253			return *su1 < *su2 ? -1 : +1;
254	return 0;
255}
256EXPORT_SYMBOL(memcmp);
257