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_STRNCPY 32 static inline char *strncpy(char *__dest, const char *__src, size_t __n) 33 { 34 register char *__xdest = __dest; 35 unsigned long __dummy; 36 37 if (__n == 0) 38 return __xdest; 39 40 __asm__ __volatile__( 41 "1:\n" 42 "mov.b @%1+, %2\n\t" 43 "mov.b %2, @%0\n\t" 44 "cmp/eq #0, %2\n\t" 45 "bt/s 2f\n\t" 46 " cmp/eq %5,%1\n\t" 47 "bf/s 1b\n\t" 48 " add #1, %0\n" 49 "2:" 50 : "=r" (__dest), "=r" (__src), "=&z" (__dummy) 51 : "0" (__dest), "1" (__src), "r" (__src+__n) 52 : "memory", "t"); 53 54 return __xdest; 55 } 56 57 #define __HAVE_ARCH_STRCMP 58 static inline int strcmp(const char *__cs, const char *__ct) 59 { 60 register int __res; 61 unsigned long __dummy; 62 63 __asm__ __volatile__( 64 "mov.b @%1+, %3\n" 65 "1:\n\t" 66 "mov.b @%0+, %2\n\t" 67 "cmp/eq #0, %3\n\t" 68 "bt 2f\n\t" 69 "cmp/eq %2, %3\n\t" 70 "bt/s 1b\n\t" 71 " mov.b @%1+, %3\n\t" 72 "add #-2, %1\n\t" 73 "mov.b @%1, %3\n\t" 74 "sub %3, %2\n" 75 "2:" 76 : "=r" (__cs), "=r" (__ct), "=&r" (__res), "=&z" (__dummy) 77 : "0" (__cs), "1" (__ct) 78 : "t"); 79 80 return __res; 81 } 82 83 #define __HAVE_ARCH_STRNCMP 84 static inline int strncmp(const char *__cs, const char *__ct, size_t __n) 85 { 86 register int __res; 87 unsigned long __dummy; 88 89 if (__n == 0) 90 return 0; 91 92 __asm__ __volatile__( 93 "mov.b @%1+, %3\n" 94 "1:\n\t" 95 "mov.b @%0+, %2\n\t" 96 "cmp/eq %6, %0\n\t" 97 "bt/s 2f\n\t" 98 " cmp/eq #0, %3\n\t" 99 "bt/s 3f\n\t" 100 " cmp/eq %3, %2\n\t" 101 "bt/s 1b\n\t" 102 " mov.b @%1+, %3\n\t" 103 "add #-2, %1\n\t" 104 "mov.b @%1, %3\n" 105 "2:\n\t" 106 "sub %3, %2\n" 107 "3:" 108 :"=r" (__cs), "=r" (__ct), "=&r" (__res), "=&z" (__dummy) 109 : "0" (__cs), "1" (__ct), "r" (__cs+__n) 110 : "t"); 111 112 return __res; 113 } 114 115 #define __HAVE_ARCH_MEMSET 116 extern void *memset(void *__s, int __c, size_t __count); 117 118 #define __HAVE_ARCH_MEMCPY 119 extern void *memcpy(void *__to, __const__ void *__from, size_t __n); 120 121 #define __HAVE_ARCH_MEMMOVE 122 extern void *memmove(void *__dest, __const__ void *__src, size_t __n); 123 124 #define __HAVE_ARCH_MEMCHR 125 extern void *memchr(const void *__s, int __c, size_t __n); 126 127 #define __HAVE_ARCH_STRLEN 128 extern size_t strlen(const char *); 129 130 #endif /* __KERNEL__ */ 131 132 #endif /* __ASM_SH_STRING_H */ 133