18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0 28c2ecf20Sopenharmony_ci#include <linux/string.h> 38c2ecf20Sopenharmony_ci#include <linux/export.h> 48c2ecf20Sopenharmony_ci 58c2ecf20Sopenharmony_cichar *strstr(const char *cs, const char *ct) 68c2ecf20Sopenharmony_ci{ 78c2ecf20Sopenharmony_ciint d0, d1; 88c2ecf20Sopenharmony_ciregister char *__res; 98c2ecf20Sopenharmony_ci__asm__ __volatile__( 108c2ecf20Sopenharmony_ci "movl %6,%%edi\n\t" 118c2ecf20Sopenharmony_ci "repne\n\t" 128c2ecf20Sopenharmony_ci "scasb\n\t" 138c2ecf20Sopenharmony_ci "notl %%ecx\n\t" 148c2ecf20Sopenharmony_ci "decl %%ecx\n\t" /* NOTE! This also sets Z if searchstring='' */ 158c2ecf20Sopenharmony_ci "movl %%ecx,%%edx\n" 168c2ecf20Sopenharmony_ci "1:\tmovl %6,%%edi\n\t" 178c2ecf20Sopenharmony_ci "movl %%esi,%%eax\n\t" 188c2ecf20Sopenharmony_ci "movl %%edx,%%ecx\n\t" 198c2ecf20Sopenharmony_ci "repe\n\t" 208c2ecf20Sopenharmony_ci "cmpsb\n\t" 218c2ecf20Sopenharmony_ci "je 2f\n\t" /* also works for empty string, see above */ 228c2ecf20Sopenharmony_ci "xchgl %%eax,%%esi\n\t" 238c2ecf20Sopenharmony_ci "incl %%esi\n\t" 248c2ecf20Sopenharmony_ci "cmpb $0,-1(%%eax)\n\t" 258c2ecf20Sopenharmony_ci "jne 1b\n\t" 268c2ecf20Sopenharmony_ci "xorl %%eax,%%eax\n\t" 278c2ecf20Sopenharmony_ci "2:" 288c2ecf20Sopenharmony_ci : "=a" (__res), "=&c" (d0), "=&S" (d1) 298c2ecf20Sopenharmony_ci : "0" (0), "1" (0xffffffff), "2" (cs), "g" (ct) 308c2ecf20Sopenharmony_ci : "dx", "di"); 318c2ecf20Sopenharmony_cireturn __res; 328c2ecf20Sopenharmony_ci} 338c2ecf20Sopenharmony_ciEXPORT_SYMBOL(strstr); 34