#include <linux/string.h> | |
char * strstr(const char * cs,const char * ct) | |
{ | |
int d0, d1; | |
register char * __res; | |
__asm__ __volatile__( | |
"movl %6,%%edi\n\t" | |
"repne\n\t" | |
"scasb\n\t" | |
"notl %%ecx\n\t" | |
"decl %%ecx\n\t" /* NOTE! This also sets Z if searchstring='' */ | |
"movl %%ecx,%%edx\n" | |
"1:\tmovl %6,%%edi\n\t" | |
"movl %%esi,%%eax\n\t" | |
"movl %%edx,%%ecx\n\t" | |
"repe\n\t" | |
"cmpsb\n\t" | |
"je 2f\n\t" /* also works for empty string, see above */ | |
"xchgl %%eax,%%esi\n\t" | |
"incl %%esi\n\t" | |
"cmpb $0,-1(%%eax)\n\t" | |
"jne 1b\n\t" | |
"xorl %%eax,%%eax\n\t" | |
"2:" | |
:"=a" (__res), "=&c" (d0), "=&S" (d1) | |
:"0" (0), "1" (0xffffffff), "2" (cs), "g" (ct) | |
:"dx", "di"); | |
return __res; | |
} | |