VServer 1.9.2 (patch-2.6.8.1-vs1.9.2.diff)
[linux-2.6.git] / include / asm-sparc64 / string.h
1 /* $Id: string.h,v 1.20 2001/09/27 04:36:24 kanoj Exp $
2  * string.h: External definitions for optimized assembly string
3  *           routines for the Linux Kernel.
4  *
5  * Copyright (C) 1995,1996 David S. Miller (davem@caip.rutgers.edu)
6  * Copyright (C) 1996,1997,1999 Jakub Jelinek (jakub@redhat.com)
7  */
8
9 #ifndef __SPARC64_STRING_H__
10 #define __SPARC64_STRING_H__
11
12 /* Really, userland/ksyms should not see any of this stuff. */
13
14 #ifdef __KERNEL__
15
16 #include <asm/asi.h>
17
18 extern void __memmove(void *,const void *,__kernel_size_t);
19 extern void *__memset(void *,int,__kernel_size_t);
20 extern void *__builtin_memset(void *,int,__kernel_size_t);
21
22 #ifndef EXPORT_SYMTAB_STROPS
23
24 /* First the mem*() things. */
25 #define __HAVE_ARCH_BCOPY
26 #define __HAVE_ARCH_MEMMOVE
27
28 #undef memmove
29 #define memmove(_to, _from, _n) \
30 ({ \
31         void *_t = (_to); \
32         __memmove(_t, (_from), (_n)); \
33         _t; \
34 })
35
36 #define __HAVE_ARCH_MEMCPY
37
38 extern void * memcpy(void *,const void *,__kernel_size_t);
39
40 #define __HAVE_ARCH_MEMSET
41
42 static inline void *__constant_memset(void *s, int c, __kernel_size_t count)
43 {
44         extern __kernel_size_t __bzero(void *, __kernel_size_t);
45
46         if(!c) {
47                 __bzero(s, count);
48                 return s;
49         } else
50                 return __memset(s, c, count);
51 }
52
53 #undef memset
54 #define memset(s, c, count) \
55 ((__builtin_constant_p(count) && (count) <= 32) ? \
56  __builtin_memset((s), (c), (count)) : \
57  (__builtin_constant_p(c) ? \
58   __constant_memset((s), (c), (count)) : \
59   __memset((s), (c), (count))))
60
61 #define __HAVE_ARCH_MEMSCAN
62
63 #undef memscan
64 #define memscan(__arg0, __char, __arg2)                                         \
65 ({                                                                              \
66         extern void *__memscan_zero(void *, size_t);                            \
67         extern void *__memscan_generic(void *, int, size_t);                    \
68         void *__retval, *__addr = (__arg0);                                     \
69         size_t __size = (__arg2);                                               \
70                                                                                 \
71         if(__builtin_constant_p(__char) && !(__char))                           \
72                 __retval = __memscan_zero(__addr, __size);                      \
73         else                                                                    \
74                 __retval = __memscan_generic(__addr, (__char), __size);         \
75                                                                                 \
76         __retval;                                                               \
77 })
78
79 #define __HAVE_ARCH_MEMCMP
80 extern int memcmp(const void *,const void *,__kernel_size_t);
81
82 /* Now the str*() stuff... */
83 #define __HAVE_ARCH_STRLEN
84
85 extern __kernel_size_t __strlen(const char *);
86 extern __kernel_size_t strlen(const char *);
87
88 #define __HAVE_ARCH_STRNCMP
89
90 extern int __strncmp(const char *, const char *, __kernel_size_t);
91
92 static inline int __constant_strncmp(const char *src, const char *dest, __kernel_size_t count)
93 {
94         register int retval;
95         switch(count) {
96         case 0: return 0;
97         case 1: return (src[0] - dest[0]);
98         case 2: retval = (src[0] - dest[0]);
99                 if(!retval && src[0])
100                   retval = (src[1] - dest[1]);
101                 return retval;
102         case 3: retval = (src[0] - dest[0]);
103                 if(!retval && src[0]) {
104                   retval = (src[1] - dest[1]);
105                   if(!retval && src[1])
106                     retval = (src[2] - dest[2]);
107                 }
108                 return retval;
109         case 4: retval = (src[0] - dest[0]);
110                 if(!retval && src[0]) {
111                   retval = (src[1] - dest[1]);
112                   if(!retval && src[1]) {
113                     retval = (src[2] - dest[2]);
114                     if (!retval && src[2])
115                       retval = (src[3] - dest[3]);
116                   }
117                 }
118                 return retval;
119         case 5: retval = (src[0] - dest[0]);
120                 if(!retval && src[0]) {
121                   retval = (src[1] - dest[1]);
122                   if(!retval && src[1]) {
123                     retval = (src[2] - dest[2]);
124                     if (!retval && src[2]) {
125                       retval = (src[3] - dest[3]);
126                       if (!retval && src[3])
127                         retval = (src[4] - dest[4]);
128                     }
129                   }
130                 }
131                 return retval;
132         default:
133                 retval = (src[0] - dest[0]);
134                 if(!retval && src[0]) {
135                   retval = (src[1] - dest[1]);
136                   if(!retval && src[1]) {
137                     retval = (src[2] - dest[2]);
138                     if(!retval && src[2])
139                       retval = __strncmp(src+3,dest+3,count-3);
140                   }
141                 }
142                 return retval;
143         }
144 }
145
146 #undef strncmp
147 #define strncmp(__arg0, __arg1, __arg2) \
148 (__builtin_constant_p(__arg2) ? \
149  __constant_strncmp(__arg0, __arg1, __arg2) : \
150  __strncmp(__arg0, __arg1, __arg2))
151
152 #endif /* !EXPORT_SYMTAB_STROPS */
153
154 #endif /* __KERNEL__ */
155
156 #endif /* !(__SPARC64_STRING_H__) */