1*b2441318SGreg Kroah-Hartman /* SPDX-License-Identifier: GPL-2.0 */
2024b246eSLinus Torvalds #ifndef __ALPHA_STRING_H__
3024b246eSLinus Torvalds #define __ALPHA_STRING_H__
4024b246eSLinus Torvalds
5024b246eSLinus Torvalds #ifdef __KERNEL__
6024b246eSLinus Torvalds
7024b246eSLinus Torvalds /*
8024b246eSLinus Torvalds * GCC of any recent vintage doesn't do stupid things with bcopy.
9024b246eSLinus Torvalds * EGCS 1.1 knows all about expanding memcpy inline, others don't.
10024b246eSLinus Torvalds *
11024b246eSLinus Torvalds * Similarly for a memset with data = 0.
12024b246eSLinus Torvalds */
13024b246eSLinus Torvalds
14024b246eSLinus Torvalds #define __HAVE_ARCH_MEMCPY
15024b246eSLinus Torvalds extern void * memcpy(void *, const void *, size_t);
16024b246eSLinus Torvalds #define __HAVE_ARCH_MEMMOVE
17024b246eSLinus Torvalds extern void * memmove(void *, const void *, size_t);
18024b246eSLinus Torvalds
19024b246eSLinus Torvalds /* For backward compatibility with modules. Unused otherwise. */
20024b246eSLinus Torvalds extern void * __memcpy(void *, const void *, size_t);
21024b246eSLinus Torvalds
22024b246eSLinus Torvalds #define memcpy __builtin_memcpy
23024b246eSLinus Torvalds
24024b246eSLinus Torvalds #define __HAVE_ARCH_MEMSET
25024b246eSLinus Torvalds extern void * __constant_c_memset(void *, unsigned long, size_t);
26a47e5bb5SRichard Henderson extern void * ___memset(void *, int, size_t);
27024b246eSLinus Torvalds extern void * __memset(void *, int, size_t);
28024b246eSLinus Torvalds extern void * memset(void *, int, size_t);
29024b246eSLinus Torvalds
30a47e5bb5SRichard Henderson /* For gcc 3.x, we cannot have the inline function named "memset" because
31a47e5bb5SRichard Henderson the __builtin_memset will attempt to resolve to the inline as well,
32a47e5bb5SRichard Henderson leading to a "sorry" about unimplemented recursive inlining. */
__memset(void * s,int c,size_t n)33a47e5bb5SRichard Henderson extern inline void *__memset(void *s, int c, size_t n)
34a47e5bb5SRichard Henderson {
35a47e5bb5SRichard Henderson if (__builtin_constant_p(c)) {
36a47e5bb5SRichard Henderson if (__builtin_constant_p(n)) {
37a47e5bb5SRichard Henderson return __builtin_memset(s, c, n);
38a47e5bb5SRichard Henderson } else {
39a47e5bb5SRichard Henderson unsigned long c8 = (c & 0xff) * 0x0101010101010101UL;
40a47e5bb5SRichard Henderson return __constant_c_memset(s, c8, n);
41a47e5bb5SRichard Henderson }
42a47e5bb5SRichard Henderson }
43a47e5bb5SRichard Henderson return ___memset(s, c, n);
44a47e5bb5SRichard Henderson }
45a47e5bb5SRichard Henderson
46a47e5bb5SRichard Henderson #define memset __memset
47024b246eSLinus Torvalds
48024b246eSLinus Torvalds #define __HAVE_ARCH_STRCPY
49024b246eSLinus Torvalds extern char * strcpy(char *,const char *);
50024b246eSLinus Torvalds #define __HAVE_ARCH_STRNCPY
51024b246eSLinus Torvalds extern char * strncpy(char *, const char *, size_t);
52024b246eSLinus Torvalds #define __HAVE_ARCH_STRCAT
53024b246eSLinus Torvalds extern char * strcat(char *, const char *);
54024b246eSLinus Torvalds #define __HAVE_ARCH_STRNCAT
55024b246eSLinus Torvalds extern char * strncat(char *, const char *, size_t);
56024b246eSLinus Torvalds #define __HAVE_ARCH_STRCHR
57024b246eSLinus Torvalds extern char * strchr(const char *,int);
58024b246eSLinus Torvalds #define __HAVE_ARCH_STRRCHR
59024b246eSLinus Torvalds extern char * strrchr(const char *,int);
60024b246eSLinus Torvalds #define __HAVE_ARCH_STRLEN
61024b246eSLinus Torvalds extern size_t strlen(const char *);
62024b246eSLinus Torvalds #define __HAVE_ARCH_MEMCHR
63024b246eSLinus Torvalds extern void * memchr(const void *, int, size_t);
64024b246eSLinus Torvalds
65024b246eSLinus Torvalds /* The following routine is like memset except that it writes 16-bit
66024b246eSLinus Torvalds aligned values. The DEST and COUNT parameters must be even for
67024b246eSLinus Torvalds correct operation. */
68024b246eSLinus Torvalds
6992ce4c3eSMatthew Wilcox #define __HAVE_ARCH_MEMSET16
7092ce4c3eSMatthew Wilcox extern void * __memset16(void *dest, unsigned short, size_t count);
memset16(uint16_t * p,uint16_t v,size_t n)7192ce4c3eSMatthew Wilcox static inline void *memset16(uint16_t *p, uint16_t v, size_t n)
7292ce4c3eSMatthew Wilcox {
7392ce4c3eSMatthew Wilcox if (__builtin_constant_p(v))
7492ce4c3eSMatthew Wilcox return __constant_c_memset(p, 0x0001000100010001UL * v, n * 2);
7592ce4c3eSMatthew Wilcox return __memset16(p, v, n * 2);
7692ce4c3eSMatthew Wilcox }
77024b246eSLinus Torvalds
78024b246eSLinus Torvalds #endif /* __KERNEL__ */
79024b246eSLinus Torvalds
80024b246eSLinus Torvalds #endif /* __ALPHA_STRING_H__ */
81