xref: /openbsd-src/lib/libc/arch/i386/string/memchr.S (revision ea6088e7d368d53c49ebfdf4520275cec2f78f5b)
1*ea6088e7Sguenther/*	$OpenBSD: memchr.S,v 1.6 2017/11/29 05:13:57 guenther Exp $ */
2df930be7Sderaadt/*
3df930be7Sderaadt * Written by J.T. Conklin <jtc@netbsd.org>.
4df930be7Sderaadt * Public domain.
5df930be7Sderaadt */
6df930be7Sderaadt
7*ea6088e7Sguenther#include "DEFS.h"
8df930be7Sderaadt
9df930be7SderaadtENTRY(memchr)
10df930be7Sderaadt	pushl	%edi
11df930be7Sderaadt	movl	8(%esp),%edi		/* string address */
12df930be7Sderaadt	movl	12(%esp),%eax		/* set character to search for */
13df930be7Sderaadt	movl	16(%esp),%ecx		/* set length of search */
14df930be7Sderaadt	testl	%ecx,%ecx		/* test for len == 0 */
15df930be7Sderaadt	jz	L1
16df930be7Sderaadt	cld				/* set search forward */
17df930be7Sderaadt	repne				/* search! */
18df930be7Sderaadt	scasb
19df930be7Sderaadt	jne	L1			/* scan failed, return null */
20df930be7Sderaadt	leal	-1(%edi),%eax		/* adjust result of scan */
21df930be7Sderaadt	popl	%edi
22df930be7Sderaadt	ret
233308d86bSderaadt	.align 2,0xcc
24df930be7SderaadtL1:	xorl	%eax,%eax
25df930be7Sderaadt	popl	%edi
26df930be7Sderaadt	ret
279b9d2a55SguentherEND_STRONG(memchr)
28