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