1c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#ifndef _I386_STRING_H_ 2c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define _I386_STRING_H_ 3c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 4c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#ifdef __KERNEL__ 5c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 6c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* Let gcc decide wether to inline or use the out of line functions */ 7c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 8c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define __HAVE_ARCH_STRCPY 9c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern char *strcpy(char *dest, const char *src); 10c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 11c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define __HAVE_ARCH_STRNCPY 12c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern char *strncpy(char *dest, const char *src, size_t count); 13c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 14c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define __HAVE_ARCH_STRCAT 15c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern char *strcat(char *dest, const char *src); 16c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 17c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define __HAVE_ARCH_STRNCAT 18c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern char *strncat(char *dest, const char *src, size_t count); 19c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 20c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define __HAVE_ARCH_STRCMP 21c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern int strcmp(const char *cs, const char *ct); 22c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 23c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define __HAVE_ARCH_STRNCMP 24c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern int strncmp(const char *cs, const char *ct, size_t count); 25c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 26c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define __HAVE_ARCH_STRCHR 27c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern char *strchr(const char *s, int c); 28c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 29c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define __HAVE_ARCH_STRLEN 30c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern size_t strlen(const char *s); 31c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 32c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic __always_inline void * __memcpy(void * to, const void * from, size_t n) 33c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{ 34c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruint d0, d1, d2; 35c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru__asm__ __volatile__( 36c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru "rep ; movsl\n\t" 37c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru "movl %4,%%ecx\n\t" 38c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru "andl $3,%%ecx\n\t" 39c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru "jz 1f\n\t" 40c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru "rep ; movsb\n\t" 41c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru "1:" 42c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru : "=&c" (d0), "=&D" (d1), "=&S" (d2) 43c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru : "0" (n/4), "g" (n), "1" ((long) to), "2" ((long) from) 44c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru : "memory"); 45c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querureturn (to); 46c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} 47c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 48c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* 49c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * This looks ugly, but the compiler can optimize it totally, 50c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * as the count is constant. 51c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 52c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic __always_inline void * __constant_memcpy(void * to, const void * from, size_t n) 53c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{ 54c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru long esi, edi; 55c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru if (!n) return to; 56c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#if 1 /* want to do small copies with non-string ops? */ 57c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru switch (n) { 58c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru case 1: *(char*)to = *(char*)from; return to; 59c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru case 2: *(short*)to = *(short*)from; return to; 60c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru case 4: *(int*)to = *(int*)from; return to; 61c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#if 1 /* including those doable with two moves? */ 62c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru case 3: *(short*)to = *(short*)from; 63c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru *((char*)to+2) = *((char*)from+2); return to; 64c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru case 5: *(int*)to = *(int*)from; 65c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru *((char*)to+4) = *((char*)from+4); return to; 66c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru case 6: *(int*)to = *(int*)from; 67c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru *((short*)to+2) = *((short*)from+2); return to; 68c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru case 8: *(int*)to = *(int*)from; 69c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru *((int*)to+1) = *((int*)from+1); return to; 70c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#endif 71c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru } 72c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#endif 73c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru esi = (long) from; 74c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru edi = (long) to; 75c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru if (n >= 5*4) { 76c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru /* large block: use rep prefix */ 77c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru int ecx; 78c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru __asm__ __volatile__( 79c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru "rep ; movsl" 80c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru : "=&c" (ecx), "=&D" (edi), "=&S" (esi) 81c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru : "0" (n/4), "1" (edi),"2" (esi) 82c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru : "memory" 83c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru ); 84c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru } else { 85c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru /* small block: don't clobber ecx + smaller code */ 86c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru if (n >= 4*4) __asm__ __volatile__("movsl" 87c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru :"=&D"(edi),"=&S"(esi):"0"(edi),"1"(esi):"memory"); 88c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru if (n >= 3*4) __asm__ __volatile__("movsl" 89c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru :"=&D"(edi),"=&S"(esi):"0"(edi),"1"(esi):"memory"); 90c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru if (n >= 2*4) __asm__ __volatile__("movsl" 91c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru :"=&D"(edi),"=&S"(esi):"0"(edi),"1"(esi):"memory"); 92c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru if (n >= 1*4) __asm__ __volatile__("movsl" 93c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru :"=&D"(edi),"=&S"(esi):"0"(edi),"1"(esi):"memory"); 94c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru } 95c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru switch (n % 4) { 96c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru /* tail */ 97c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru case 0: return to; 98c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru case 1: __asm__ __volatile__("movsb" 99c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru :"=&D"(edi),"=&S"(esi):"0"(edi),"1"(esi):"memory"); 100c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru return to; 101c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru case 2: __asm__ __volatile__("movsw" 102c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru :"=&D"(edi),"=&S"(esi):"0"(edi),"1"(esi):"memory"); 103c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru return to; 104c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru default: __asm__ __volatile__("movsw\n\tmovsb" 105c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru :"=&D"(edi),"=&S"(esi):"0"(edi),"1"(esi):"memory"); 106c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru return to; 107c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru } 108c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} 109c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 110c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define __HAVE_ARCH_MEMCPY 111c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 112c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#ifdef CONFIG_X86_USE_3DNOW 113c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 114c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#include <asm/mmx.h> 115c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 116c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* 117c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * This CPU favours 3DNow strongly (eg AMD Athlon) 118c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 119c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 120c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline void * __constant_memcpy3d(void * to, const void * from, size_t len) 121c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{ 122c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru if (len < 512) 123c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru return __constant_memcpy(to, from, len); 124c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru return _mmx_memcpy(to, from, len); 125c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} 126c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 127c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic __inline__ void *__memcpy3d(void *to, const void *from, size_t len) 128c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{ 129c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru if (len < 512) 130c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru return __memcpy(to, from, len); 131c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru return _mmx_memcpy(to, from, len); 132c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} 133c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 134c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define memcpy(t, f, n) \ 135c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru(__builtin_constant_p(n) ? \ 136c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru __constant_memcpy3d((t),(f),(n)) : \ 137c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru __memcpy3d((t),(f),(n))) 138c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 139c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#else 140c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 141c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* 142c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * No 3D Now! 143c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 144c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 145c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define memcpy(t, f, n) \ 146c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru(__builtin_constant_p(n) ? \ 147c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru __constant_memcpy((t),(f),(n)) : \ 148c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru __memcpy((t),(f),(n))) 149c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 150c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#endif 151c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 152c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define __HAVE_ARCH_MEMMOVE 153c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruvoid *memmove(void * dest,const void * src, size_t n); 154c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 155c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define memcmp __builtin_memcmp 156c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 157c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define __HAVE_ARCH_MEMCHR 158c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void *memchr(const void * cs,int c,size_t count); 159c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 160c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline void * __memset_generic(void * s, char c,size_t count) 161c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{ 162c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruint d0, d1; 163c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru__asm__ __volatile__( 164c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru "rep\n\t" 165c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru "stosb" 166c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru : "=&c" (d0), "=&D" (d1) 167c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru :"a" (c),"1" (s),"0" (count) 168c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru :"memory"); 169c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querureturn s; 170c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} 171c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 172c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* we might want to write optimized versions of these later */ 173c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define __constant_count_memset(s,c,count) __memset_generic((s),(c),(count)) 174c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 175c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* 176c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * memset(x,0,y) is a reasonably common thing to do, so we want to fill 177c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * things 32 bits at a time even when we don't know the size of the 178c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * area at compile-time.. 179c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 180c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic __always_inline void * __constant_c_memset(void * s, unsigned long c, size_t count) 181c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{ 182c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruint d0, d1; 183c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru__asm__ __volatile__( 184c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru "rep ; stosl\n\t" 185c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru "testb $2,%b3\n\t" 186c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru "je 1f\n\t" 187c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru "stosw\n" 188c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru "1:\ttestb $1,%b3\n\t" 189c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru "je 2f\n\t" 190c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru "stosb\n" 191c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru "2:" 192c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru :"=&c" (d0), "=&D" (d1) 193c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru :"a" (c), "q" (count), "0" (count/4), "1" ((long) s) 194c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru :"memory"); 195c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querureturn (s); 196c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} 197c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 198c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* Added by Gertjan van Wingerde to make minix and sysv module work */ 199c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define __HAVE_ARCH_STRNLEN 200c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern size_t strnlen(const char * s, size_t count); 201c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* end of additional stuff */ 202c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 203c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define __HAVE_ARCH_STRSTR 204c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern char *strstr(const char *cs, const char *ct); 205c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 206c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* 207c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * This looks horribly ugly, but the compiler can optimize it totally, 208c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * as we by now know that both pattern and count is constant.. 209c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 210c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic __always_inline void * __constant_c_and_count_memset(void * s, unsigned long pattern, size_t count) 211c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{ 212c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru switch (count) { 213c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru case 0: 214c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru return s; 215c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru case 1: 216c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru *(unsigned char *)s = pattern; 217c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru return s; 218c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru case 2: 219c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru *(unsigned short *)s = pattern; 220c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru return s; 221c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru case 3: 222c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru *(unsigned short *)s = pattern; 223c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru *(2+(unsigned char *)s) = pattern; 224c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru return s; 225c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru case 4: 226c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru *(unsigned long *)s = pattern; 227c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru return s; 228c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru } 229c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define COMMON(x) \ 230c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru__asm__ __volatile__( \ 231c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru "rep ; stosl" \ 232c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru x \ 233c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru : "=&c" (d0), "=&D" (d1) \ 234c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru : "a" (pattern),"0" (count/4),"1" ((long) s) \ 235c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru : "memory") 236c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{ 237c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru int d0, d1; 238c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru switch (count % 4) { 239c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru case 0: COMMON(""); return s; 240c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru case 1: COMMON("\n\tstosb"); return s; 241c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru case 2: COMMON("\n\tstosw"); return s; 242c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru default: COMMON("\n\tstosw\n\tstosb"); return s; 243c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru } 244c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} 245c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 246c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#undef COMMON 247c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} 248c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 249c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define __constant_c_x_memset(s, c, count) \ 250c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru(__builtin_constant_p(count) ? \ 251c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru __constant_c_and_count_memset((s),(c),(count)) : \ 252c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru __constant_c_memset((s),(c),(count))) 253c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 254c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define __memset(s, c, count) \ 255c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru(__builtin_constant_p(count) ? \ 256c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru __constant_count_memset((s),(c),(count)) : \ 257c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru __memset_generic((s),(c),(count))) 258c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 259c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define __HAVE_ARCH_MEMSET 260c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define memset(s, c, count) \ 261c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru(__builtin_constant_p(c) ? \ 262c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru __constant_c_x_memset((s),(0x01010101UL*(unsigned char)(c)),(count)) : \ 263c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru __memset((s),(c),(count))) 264c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 265c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* 266c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * find the first occurrence of byte 'c', or 1 past the area if none 267c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 268c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define __HAVE_ARCH_MEMSCAN 269c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void *memscan(void * addr, int c, size_t size); 270c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 271c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#endif /* __KERNEL__ */ 272c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 273c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#endif 274