1 /* SPDX-License-Identifier: GPL-2.0 */ 2 #ifndef __ASM_SH_STRING_H 3 #define __ASM_SH_STRING_H 4 5 #ifdef __KERNEL__ 6 7 /* 8 * Copyright (C) 1999 Niibe Yutaka 9 * But consider these trivial functions to be public domain. 10 */ 11 12 #define __HAVE_ARCH_STRCPY 13 static inline char *strcpy(char *__dest, const char *__src) 14 { 15 register char *__xdest = __dest; 16 unsigned long __dummy; 17 18 __asm__ __volatile__("1:\n\t" 19 "mov.b @%1+, %2\n\t" 20 "mov.b %2, @%0\n\t" 21 "cmp/eq #0, %2\n\t" 22 "bf/s 1b\n\t" 23 " add #1, %0\n\t" 24 : "=r" (__dest), "=r" (__src), "=&z" (__dummy) 25 : "0" (__dest), "1" (__src) 26 : "memory", "t"); 27 28 return __xdest; 29 } 30 31 #define __HAVE_ARCH_STRCMP 32 static inline int strcmp(const char *__cs, const char *__ct) 33 { 34 register int __res; 35 unsigned long __dummy; 36 37 __asm__ __volatile__( 38 "mov.b @%1+, %3\n" 39 "1:\n\t" 40 "mov.b @%0+, %2\n\t" 41 "cmp/eq #0, %3\n\t" 42 "bt 2f\n\t" 43 "cmp/eq %2, %3\n\t" 44 "bt/s 1b\n\t" 45 " mov.b @%1+, %3\n\t" 46 "add #-2, %1\n\t" 47 "mov.b @%1, %3\n\t" 48 "sub %3, %2\n" 49 "2:" 50 : "=r" (__cs), "=r" (__ct), "=&r" (__res), "=&z" (__dummy) 51 : "0" (__cs), "1" (__ct) 52 : "t"); 53 54 return __res; 55 } 56 57 #define __HAVE_ARCH_STRNCMP 58 static inline int strncmp(const char *__cs, const char *__ct, size_t __n) 59 { 60 register int __res; 61 unsigned long __dummy; 62 63 if (__n == 0) 64 return 0; 65 66 __asm__ __volatile__( 67 "mov.b @%1+, %3\n" 68 "1:\n\t" 69 "mov.b @%0+, %2\n\t" 70 "cmp/eq %6, %0\n\t" 71 "bt/s 2f\n\t" 72 " cmp/eq #0, %3\n\t" 73 "bt/s 3f\n\t" 74 " cmp/eq %3, %2\n\t" 75 "bt/s 1b\n\t" 76 " mov.b @%1+, %3\n\t" 77 "add #-2, %1\n\t" 78 "mov.b @%1, %3\n" 79 "2:\n\t" 80 "sub %3, %2\n" 81 "3:" 82 :"=r" (__cs), "=r" (__ct), "=&r" (__res), "=&z" (__dummy) 83 : "0" (__cs), "1" (__ct), "r" (__cs+__n) 84 : "t"); 85 86 return __res; 87 } 88 89 #define __HAVE_ARCH_MEMSET 90 extern void *memset(void *__s, int __c, size_t __count); 91 92 #define __HAVE_ARCH_MEMCPY 93 extern void *memcpy(void *__to, __const__ void *__from, size_t __n); 94 95 #define __HAVE_ARCH_MEMMOVE 96 extern void *memmove(void *__dest, __const__ void *__src, size_t __n); 97 98 #define __HAVE_ARCH_MEMCHR 99 extern void *memchr(const void *__s, int __c, size_t __n); 100 101 #define __HAVE_ARCH_STRLEN 102 extern size_t strlen(const char *); 103 104 #endif /* __KERNEL__ */ 105 106 #endif /* __ASM_SH_STRING_H */ 107