1*819833afSPeter Tyser #ifndef __ASM_SH_STRING_H 2*819833afSPeter Tyser #define __ASM_SH_STRING_H 3*819833afSPeter Tyser 4*819833afSPeter Tyser /* 5*819833afSPeter Tyser * Copyright (C) 1999 Niibe Yutaka 6*819833afSPeter Tyser * But consider these trivial functions to be public domain. 7*819833afSPeter Tyser * 8*819833afSPeter Tyser * from linux kernel code. 9*819833afSPeter Tyser */ 10*819833afSPeter Tyser 11*819833afSPeter Tyser #ifdef __KERNEL__ /* only set these up for kernel code */ 12*819833afSPeter Tyser 13*819833afSPeter Tyser #define __HAVE_ARCH_STRCPY 14*819833afSPeter Tyser static inline char *strcpy(char *__dest, const char *__src) 15*819833afSPeter Tyser { 16*819833afSPeter Tyser register char *__xdest = __dest; 17*819833afSPeter Tyser unsigned long __dummy; 18*819833afSPeter Tyser 19*819833afSPeter Tyser __asm__ __volatile__("1:\n\t" 20*819833afSPeter Tyser "mov.b @%1+, %2\n\t" 21*819833afSPeter Tyser "mov.b %2, @%0\n\t" 22*819833afSPeter Tyser "cmp/eq #0, %2\n\t" 23*819833afSPeter Tyser "bf/s 1b\n\t" 24*819833afSPeter Tyser " add #1, %0\n\t" 25*819833afSPeter Tyser : "=r" (__dest), "=r" (__src), "=&z" (__dummy) 26*819833afSPeter Tyser : "0" (__dest), "1" (__src) 27*819833afSPeter Tyser : "memory", "t"); 28*819833afSPeter Tyser 29*819833afSPeter Tyser return __xdest; 30*819833afSPeter Tyser } 31*819833afSPeter Tyser 32*819833afSPeter Tyser #define __HAVE_ARCH_STRNCPY 33*819833afSPeter Tyser static inline char *strncpy(char *__dest, const char *__src, size_t __n) 34*819833afSPeter Tyser { 35*819833afSPeter Tyser register char *__xdest = __dest; 36*819833afSPeter Tyser unsigned long __dummy; 37*819833afSPeter Tyser 38*819833afSPeter Tyser if (__n == 0) 39*819833afSPeter Tyser return __xdest; 40*819833afSPeter Tyser 41*819833afSPeter Tyser __asm__ __volatile__( 42*819833afSPeter Tyser "1:\n" 43*819833afSPeter Tyser "mov.b @%1+, %2\n\t" 44*819833afSPeter Tyser "mov.b %2, @%0\n\t" 45*819833afSPeter Tyser "cmp/eq #0, %2\n\t" 46*819833afSPeter Tyser "bt/s 2f\n\t" 47*819833afSPeter Tyser " cmp/eq %5,%1\n\t" 48*819833afSPeter Tyser "bf/s 1b\n\t" 49*819833afSPeter Tyser " add #1, %0\n" 50*819833afSPeter Tyser "2:" 51*819833afSPeter Tyser : "=r" (__dest), "=r" (__src), "=&z" (__dummy) 52*819833afSPeter Tyser : "0" (__dest), "1" (__src), "r" (__src+__n) 53*819833afSPeter Tyser : "memory", "t"); 54*819833afSPeter Tyser 55*819833afSPeter Tyser return __xdest; 56*819833afSPeter Tyser } 57*819833afSPeter Tyser 58*819833afSPeter Tyser #define __HAVE_ARCH_STRCMP 59*819833afSPeter Tyser static inline int strcmp(const char *__cs, const char *__ct) 60*819833afSPeter Tyser { 61*819833afSPeter Tyser register int __res; 62*819833afSPeter Tyser unsigned long __dummy; 63*819833afSPeter Tyser 64*819833afSPeter Tyser __asm__ __volatile__( 65*819833afSPeter Tyser "mov.b @%1+, %3\n" 66*819833afSPeter Tyser "1:\n\t" 67*819833afSPeter Tyser "mov.b @%0+, %2\n\t" 68*819833afSPeter Tyser "cmp/eq #0, %3\n\t" 69*819833afSPeter Tyser "bt 2f\n\t" 70*819833afSPeter Tyser "cmp/eq %2, %3\n\t" 71*819833afSPeter Tyser "bt/s 1b\n\t" 72*819833afSPeter Tyser " mov.b @%1+, %3\n\t" 73*819833afSPeter Tyser "add #-2, %1\n\t" 74*819833afSPeter Tyser "mov.b @%1, %3\n\t" 75*819833afSPeter Tyser "sub %3, %2\n" 76*819833afSPeter Tyser "2:" 77*819833afSPeter Tyser : "=r" (__cs), "=r" (__ct), "=&r" (__res), "=&z" (__dummy) 78*819833afSPeter Tyser : "0" (__cs), "1" (__ct) 79*819833afSPeter Tyser : "t"); 80*819833afSPeter Tyser 81*819833afSPeter Tyser return __res; 82*819833afSPeter Tyser } 83*819833afSPeter Tyser 84*819833afSPeter Tyser #define __HAVE_ARCH_STRNCMP 85*819833afSPeter Tyser static inline int strncmp(const char *__cs, const char *__ct, size_t __n) 86*819833afSPeter Tyser { 87*819833afSPeter Tyser register int __res; 88*819833afSPeter Tyser unsigned long __dummy; 89*819833afSPeter Tyser 90*819833afSPeter Tyser if (__n == 0) 91*819833afSPeter Tyser return 0; 92*819833afSPeter Tyser 93*819833afSPeter Tyser __asm__ __volatile__( 94*819833afSPeter Tyser "mov.b @%1+, %3\n" 95*819833afSPeter Tyser "1:\n\t" 96*819833afSPeter Tyser "mov.b @%0+, %2\n\t" 97*819833afSPeter Tyser "cmp/eq %6, %0\n\t" 98*819833afSPeter Tyser "bt/s 2f\n\t" 99*819833afSPeter Tyser " cmp/eq #0, %3\n\t" 100*819833afSPeter Tyser "bt/s 3f\n\t" 101*819833afSPeter Tyser " cmp/eq %3, %2\n\t" 102*819833afSPeter Tyser "bt/s 1b\n\t" 103*819833afSPeter Tyser " mov.b @%1+, %3\n\t" 104*819833afSPeter Tyser "add #-2, %1\n\t" 105*819833afSPeter Tyser "mov.b @%1, %3\n" 106*819833afSPeter Tyser "2:\n\t" 107*819833afSPeter Tyser "sub %3, %2\n" 108*819833afSPeter Tyser "3:" 109*819833afSPeter Tyser :"=r" (__cs), "=r" (__ct), "=&r" (__res), "=&z" (__dummy) 110*819833afSPeter Tyser : "0" (__cs), "1" (__ct), "r" (__cs+__n) 111*819833afSPeter Tyser : "t"); 112*819833afSPeter Tyser 113*819833afSPeter Tyser return __res; 114*819833afSPeter Tyser } 115*819833afSPeter Tyser 116*819833afSPeter Tyser #undef __HAVE_ARCH_MEMSET 117*819833afSPeter Tyser extern void *memset(void *__s, int __c, size_t __count); 118*819833afSPeter Tyser 119*819833afSPeter Tyser #undef __HAVE_ARCH_MEMCPY 120*819833afSPeter Tyser extern void *memcpy(void *__to, __const__ void *__from, size_t __n); 121*819833afSPeter Tyser 122*819833afSPeter Tyser #undef __HAVE_ARCH_MEMMOVE 123*819833afSPeter Tyser extern void *memmove(void *__dest, __const__ void *__src, size_t __n); 124*819833afSPeter Tyser 125*819833afSPeter Tyser #undef __HAVE_ARCH_MEMCHR 126*819833afSPeter Tyser extern void *memchr(const void *__s, int __c, size_t __n); 127*819833afSPeter Tyser 128*819833afSPeter Tyser #undef __HAVE_ARCH_STRLEN 129*819833afSPeter Tyser extern size_t strlen(const char *); 130*819833afSPeter Tyser 131*819833afSPeter Tyser /* arch/sh/lib/strcasecmp.c */ 132*819833afSPeter Tyser extern int strcasecmp(const char *, const char *); 133*819833afSPeter Tyser 134*819833afSPeter Tyser #else /* KERNEL */ 135*819833afSPeter Tyser 136*819833afSPeter Tyser /* 137*819833afSPeter Tyser * let user libraries deal with these, 138*819833afSPeter Tyser * IMHO the kernel has no place defining these functions for user apps 139*819833afSPeter Tyser */ 140*819833afSPeter Tyser 141*819833afSPeter Tyser #define __HAVE_ARCH_STRCPY 1 142*819833afSPeter Tyser #define __HAVE_ARCH_STRNCPY 1 143*819833afSPeter Tyser #define __HAVE_ARCH_STRCAT 1 144*819833afSPeter Tyser #define __HAVE_ARCH_STRNCAT 1 145*819833afSPeter Tyser #define __HAVE_ARCH_STRCMP 1 146*819833afSPeter Tyser #define __HAVE_ARCH_STRNCMP 1 147*819833afSPeter Tyser #define __HAVE_ARCH_STRNICMP 1 148*819833afSPeter Tyser #define __HAVE_ARCH_STRCHR 1 149*819833afSPeter Tyser #define __HAVE_ARCH_STRRCHR 1 150*819833afSPeter Tyser #define __HAVE_ARCH_STRSTR 1 151*819833afSPeter Tyser #define __HAVE_ARCH_STRLEN 1 152*819833afSPeter Tyser #define __HAVE_ARCH_STRNLEN 1 153*819833afSPeter Tyser #define __HAVE_ARCH_MEMSET 1 154*819833afSPeter Tyser #define __HAVE_ARCH_MEMCPY 1 155*819833afSPeter Tyser #define __HAVE_ARCH_MEMMOVE 1 156*819833afSPeter Tyser #define __HAVE_ARCH_MEMSCAN 1 157*819833afSPeter Tyser #define __HAVE_ARCH_MEMCMP 1 158*819833afSPeter Tyser #define __HAVE_ARCH_MEMCHR 1 159*819833afSPeter Tyser #define __HAVE_ARCH_STRTOK 1 160*819833afSPeter Tyser 161*819833afSPeter Tyser #endif /* KERNEL */ 162*819833afSPeter Tyser #endif /* __ASM_SH_STRING_H */ 163