162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0 262306a36Sopenharmony_ci#include <linux/string.h> 362306a36Sopenharmony_ci#include <linux/export.h> 462306a36Sopenharmony_ci 562306a36Sopenharmony_cichar *strstr(const char *cs, const char *ct) 662306a36Sopenharmony_ci{ 762306a36Sopenharmony_ciint d0, d1; 862306a36Sopenharmony_ciregister char *__res; 962306a36Sopenharmony_ci__asm__ __volatile__( 1062306a36Sopenharmony_ci "movl %6,%%edi\n\t" 1162306a36Sopenharmony_ci "repne\n\t" 1262306a36Sopenharmony_ci "scasb\n\t" 1362306a36Sopenharmony_ci "notl %%ecx\n\t" 1462306a36Sopenharmony_ci "decl %%ecx\n\t" /* NOTE! This also sets Z if searchstring='' */ 1562306a36Sopenharmony_ci "movl %%ecx,%%edx\n" 1662306a36Sopenharmony_ci "1:\tmovl %6,%%edi\n\t" 1762306a36Sopenharmony_ci "movl %%esi,%%eax\n\t" 1862306a36Sopenharmony_ci "movl %%edx,%%ecx\n\t" 1962306a36Sopenharmony_ci "repe\n\t" 2062306a36Sopenharmony_ci "cmpsb\n\t" 2162306a36Sopenharmony_ci "je 2f\n\t" /* also works for empty string, see above */ 2262306a36Sopenharmony_ci "xchgl %%eax,%%esi\n\t" 2362306a36Sopenharmony_ci "incl %%esi\n\t" 2462306a36Sopenharmony_ci "cmpb $0,-1(%%eax)\n\t" 2562306a36Sopenharmony_ci "jne 1b\n\t" 2662306a36Sopenharmony_ci "xorl %%eax,%%eax\n\t" 2762306a36Sopenharmony_ci "2:" 2862306a36Sopenharmony_ci : "=a" (__res), "=&c" (d0), "=&S" (d1) 2962306a36Sopenharmony_ci : "0" (0), "1" (0xffffffff), "2" (cs), "g" (ct) 3062306a36Sopenharmony_ci : "dx", "di"); 3162306a36Sopenharmony_cireturn __res; 3262306a36Sopenharmony_ci} 3362306a36Sopenharmony_ciEXPORT_SYMBOL(strstr); 34