summaryrefslogtreecommitdiff
path: root/libc/string/i386/rawmemchr.c
blob: be0b142c35372ef07d274f5f13dc66ebf2384b60 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
/*
 * Adapted from strlen.c code
 *
 * Copyright (C) 2008 Denys Vlasenko <vda.linux@googlemail.com>
 *
 * Licensed under the LGPL v2.1, see the file COPYING.LIB in this tarball.
 */

#include <string.h>

#undef rawmemchr
void *rawmemchr(const void *s, int c)
{
	void *eax;
	int ecx, edi;
	__asm__ __volatile__(
		"	repne; scasb\n"
		"	leal	-1(%%edi), %%eax\n"
		: "=&c" (ecx), "=&D" (edi), "=&a" (eax)
		: "0" (0xffffffff), "1" (s), "2" (c)
	);
	return eax;
}
libc_hidden_def(rawmemchr)