at v2.6.32-rc4 143 lines 3.4 kB view raw
1/* 2 * Copyright 2004-2008 Analog Devices Inc. 3 * 4 * Licensed under the GPL-2 or later. 5 */ 6 7#ifndef _BLACKFIN_STRING_H_ 8#define _BLACKFIN_STRING_H_ 9 10#include <linux/types.h> 11 12#ifdef __KERNEL__ /* only set these up for kernel code */ 13 14#define __HAVE_ARCH_STRCPY 15extern inline char *strcpy(char *dest, const char *src) 16{ 17 char *xdest = dest; 18 char temp = 0; 19 20 __asm__ __volatile__ ( 21 "1:" 22 "%2 = B [%1++] (Z);" 23 "B [%0++] = %2;" 24 "CC = %2;" 25 "if cc jump 1b (bp);" 26 : "+&a" (dest), "+&a" (src), "=&d" (temp) 27 : 28 : "memory", "CC"); 29 30 return xdest; 31} 32 33#define __HAVE_ARCH_STRNCPY 34extern inline char *strncpy(char *dest, const char *src, size_t n) 35{ 36 char *xdest = dest; 37 char temp = 0; 38 39 if (n == 0) 40 return xdest; 41 42 __asm__ __volatile__ ( 43 "1:" 44 "%3 = B [%1++] (Z);" 45 "B [%0++] = %3;" 46 "CC = %3;" 47 "if ! cc jump 2f;" 48 "%2 += -1;" 49 "CC = %2 == 0;" 50 "if ! cc jump 1b (bp);" 51 "jump 4f;" 52 "2:" 53 /* if src is shorter than n, we need to null pad bytes now */ 54 "%3 = 0;" 55 "3:" 56 "%2 += -1;" 57 "CC = %2 == 0;" 58 "if cc jump 4f;" 59 "B [%0++] = %3;" 60 "jump 3b;" 61 "4:" 62 : "+&a" (dest), "+&a" (src), "+&da" (n), "=&d" (temp) 63 : 64 : "memory", "CC"); 65 66 return xdest; 67} 68 69#define __HAVE_ARCH_STRCMP 70extern inline int strcmp(const char *cs, const char *ct) 71{ 72 /* need to use int's here so the char's in the assembly don't get 73 * sign extended incorrectly when we don't want them to be 74 */ 75 int __res1, __res2; 76 77 __asm__ __volatile__ ( 78 "1:" 79 "%2 = B[%0++] (Z);" /* get *cs */ 80 "%3 = B[%1++] (Z);" /* get *ct */ 81 "CC = %2 == %3;" /* compare a byte */ 82 "if ! cc jump 2f;" /* not equal, break out */ 83 "CC = %2;" /* at end of cs? */ 84 "if cc jump 1b (bp);" /* no, keep going */ 85 "jump.s 3f;" /* strings are equal */ 86 "2:" 87 "%2 = %2 - %3;" /* *cs - *ct */ 88 "3:" 89 : "+&a" (cs), "+&a" (ct), "=&d" (__res1), "=&d" (__res2) 90 : 91 : "memory", "CC"); 92 93 return __res1; 94} 95 96#define __HAVE_ARCH_STRNCMP 97extern inline int strncmp(const char *cs, const char *ct, size_t count) 98{ 99 /* need to use int's here so the char's in the assembly don't get 100 * sign extended incorrectly when we don't want them to be 101 */ 102 int __res1, __res2; 103 104 if (!count) 105 return 0; 106 107 __asm__ __volatile__ ( 108 "1:" 109 "%3 = B[%0++] (Z);" /* get *cs */ 110 "%4 = B[%1++] (Z);" /* get *ct */ 111 "CC = %3 == %4;" /* compare a byte */ 112 "if ! cc jump 3f;" /* not equal, break out */ 113 "CC = %3;" /* at end of cs? */ 114 "if ! cc jump 4f;" /* yes, all done */ 115 "%2 += -1;" /* no, adjust count */ 116 "CC = %2 == 0;" 117 "if ! cc jump 1b;" /* more to do, keep going */ 118 "2:" 119 "%3 = 0;" /* strings are equal */ 120 "jump.s 4f;" 121 "3:" 122 "%3 = %3 - %4;" /* *cs - *ct */ 123 "4:" 124 : "+&a" (cs), "+&a" (ct), "+&da" (count), "=&d" (__res1), "=&d" (__res2) 125 : 126 : "memory", "CC"); 127 128 return __res1; 129} 130 131#define __HAVE_ARCH_MEMSET 132extern void *memset(void *s, int c, size_t count); 133#define __HAVE_ARCH_MEMCPY 134extern void *memcpy(void *d, const void *s, size_t count); 135#define __HAVE_ARCH_MEMCMP 136extern int memcmp(const void *, const void *, __kernel_size_t); 137#define __HAVE_ARCH_MEMCHR 138extern void *memchr(const void *s, int c, size_t n); 139#define __HAVE_ARCH_MEMMOVE 140extern void *memmove(void *dest, const void *src, size_t count); 141 142#endif /*__KERNEL__*/ 143#endif /* _BLACKFIN_STRING_H_ */