// SPDX-License-Identifier: GPL-2.0 | |
#include <linux/string.h> | |
#include <linux/export.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; | |
} | |
EXPORT_SYMBOL(strstr); |