xref: /OK3568_Linux_fs/kernel/arch/alpha/include/asm/string.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 */
2*4882a593Smuzhiyun #ifndef __ALPHA_STRING_H__
3*4882a593Smuzhiyun #define __ALPHA_STRING_H__
4*4882a593Smuzhiyun 
5*4882a593Smuzhiyun #ifdef __KERNEL__
6*4882a593Smuzhiyun 
7*4882a593Smuzhiyun /*
8*4882a593Smuzhiyun  * GCC of any recent vintage doesn't do stupid things with bcopy.
9*4882a593Smuzhiyun  * EGCS 1.1 knows all about expanding memcpy inline, others don't.
10*4882a593Smuzhiyun  *
11*4882a593Smuzhiyun  * Similarly for a memset with data = 0.
12*4882a593Smuzhiyun  */
13*4882a593Smuzhiyun 
14*4882a593Smuzhiyun #define __HAVE_ARCH_MEMCPY
15*4882a593Smuzhiyun extern void * memcpy(void *, const void *, size_t);
16*4882a593Smuzhiyun #define __HAVE_ARCH_MEMMOVE
17*4882a593Smuzhiyun extern void * memmove(void *, const void *, size_t);
18*4882a593Smuzhiyun 
19*4882a593Smuzhiyun /* For backward compatibility with modules.  Unused otherwise.  */
20*4882a593Smuzhiyun extern void * __memcpy(void *, const void *, size_t);
21*4882a593Smuzhiyun 
22*4882a593Smuzhiyun #define memcpy __builtin_memcpy
23*4882a593Smuzhiyun 
24*4882a593Smuzhiyun #define __HAVE_ARCH_MEMSET
25*4882a593Smuzhiyun extern void * __constant_c_memset(void *, unsigned long, size_t);
26*4882a593Smuzhiyun extern void * ___memset(void *, int, size_t);
27*4882a593Smuzhiyun extern void * __memset(void *, int, size_t);
28*4882a593Smuzhiyun extern void * memset(void *, int, size_t);
29*4882a593Smuzhiyun 
30*4882a593Smuzhiyun /* For gcc 3.x, we cannot have the inline function named "memset" because
31*4882a593Smuzhiyun    the __builtin_memset will attempt to resolve to the inline as well,
32*4882a593Smuzhiyun    leading to a "sorry" about unimplemented recursive inlining.  */
__memset(void * s,int c,size_t n)33*4882a593Smuzhiyun extern inline void *__memset(void *s, int c, size_t n)
34*4882a593Smuzhiyun {
35*4882a593Smuzhiyun 	if (__builtin_constant_p(c)) {
36*4882a593Smuzhiyun 		if (__builtin_constant_p(n)) {
37*4882a593Smuzhiyun 			return __builtin_memset(s, c, n);
38*4882a593Smuzhiyun 		} else {
39*4882a593Smuzhiyun 			unsigned long c8 = (c & 0xff) * 0x0101010101010101UL;
40*4882a593Smuzhiyun 			return __constant_c_memset(s, c8, n);
41*4882a593Smuzhiyun 		}
42*4882a593Smuzhiyun 	}
43*4882a593Smuzhiyun 	return ___memset(s, c, n);
44*4882a593Smuzhiyun }
45*4882a593Smuzhiyun 
46*4882a593Smuzhiyun #define memset __memset
47*4882a593Smuzhiyun 
48*4882a593Smuzhiyun #define __HAVE_ARCH_STRCPY
49*4882a593Smuzhiyun extern char * strcpy(char *,const char *);
50*4882a593Smuzhiyun #define __HAVE_ARCH_STRNCPY
51*4882a593Smuzhiyun extern char * strncpy(char *, const char *, size_t);
52*4882a593Smuzhiyun #define __HAVE_ARCH_STRCAT
53*4882a593Smuzhiyun extern char * strcat(char *, const char *);
54*4882a593Smuzhiyun #define __HAVE_ARCH_STRNCAT
55*4882a593Smuzhiyun extern char * strncat(char *, const char *, size_t);
56*4882a593Smuzhiyun #define __HAVE_ARCH_STRCHR
57*4882a593Smuzhiyun extern char * strchr(const char *,int);
58*4882a593Smuzhiyun #define __HAVE_ARCH_STRRCHR
59*4882a593Smuzhiyun extern char * strrchr(const char *,int);
60*4882a593Smuzhiyun #define __HAVE_ARCH_STRLEN
61*4882a593Smuzhiyun extern size_t strlen(const char *);
62*4882a593Smuzhiyun #define __HAVE_ARCH_MEMCHR
63*4882a593Smuzhiyun extern void * memchr(const void *, int, size_t);
64*4882a593Smuzhiyun 
65*4882a593Smuzhiyun /* The following routine is like memset except that it writes 16-bit
66*4882a593Smuzhiyun    aligned values.  The DEST and COUNT parameters must be even for
67*4882a593Smuzhiyun    correct operation.  */
68*4882a593Smuzhiyun 
69*4882a593Smuzhiyun #define __HAVE_ARCH_MEMSET16
70*4882a593Smuzhiyun extern void * __memset16(void *dest, unsigned short, size_t count);
memset16(uint16_t * p,uint16_t v,size_t n)71*4882a593Smuzhiyun static inline void *memset16(uint16_t *p, uint16_t v, size_t n)
72*4882a593Smuzhiyun {
73*4882a593Smuzhiyun 	if (__builtin_constant_p(v))
74*4882a593Smuzhiyun 		return __constant_c_memset(p, 0x0001000100010001UL * v, n * 2);
75*4882a593Smuzhiyun 	return __memset16(p, v, n * 2);
76*4882a593Smuzhiyun }
77*4882a593Smuzhiyun 
78*4882a593Smuzhiyun #endif /* __KERNEL__ */
79*4882a593Smuzhiyun 
80*4882a593Smuzhiyun #endif /* __ALPHA_STRING_H__ */
81