xref: /openbsd-src/sys/lib/libkern/arch/i386/memchr.S (revision 737e061132473fb2b37fc15648b2a2378e910cae)
1*737e0611Stedu/*	$OpenBSD: memchr.S,v 1.2 2014/11/29 18:51:23 tedu Exp $	*/
2f47c597bSchuck
3f47c597bSchuck/*
4f47c597bSchuck * Written by J.T. Conklin <jtc@netbsd.org>.
5f47c597bSchuck * Public domain.
6f47c597bSchuck */
7f47c597bSchuck
8f47c597bSchuck#include <machine/asm.h>
9f47c597bSchuck
10f47c597bSchuckENTRY(memchr)
11f47c597bSchuck	pushl	%edi
12f47c597bSchuck	movl	8(%esp),%edi		/* string address */
13f47c597bSchuck	movl	12(%esp),%eax		/* set character to search for */
14f47c597bSchuck	movl	16(%esp),%ecx		/* set length of search */
15f47c597bSchuck	testl	%ecx,%ecx		/* test for len == 0 */
16f47c597bSchuck	jz	L1
17f47c597bSchuck	repne				/* search! */
18f47c597bSchuck	scasb
19f47c597bSchuck	jne	L1			/* scan failed, return null */
20f47c597bSchuck	leal	-1(%edi),%eax		/* adjust result of scan */
21f47c597bSchuck	popl	%edi
22f47c597bSchuck	ret
23f47c597bSchuck	.align 2,0x90
24f47c597bSchuckL1:	xorl	%eax,%eax
25f47c597bSchuck	popl	%edi
26f47c597bSchuck	ret
27