1/*
2 * ====================================================
3 * Copyright (C) 1998, 2002, 2008 by Red Hat Inc. All rights reserved.
4 *
5 * Permission to use, copy, modify, and distribute this
6 * software is freely granted, provided that this notice
7 * is preserved.
8 * ====================================================
9 */
10
11	#include "i386mach.h"
12
13	.global	SYM (memchr)
14       SOTYPE_FUNCTION(memchr)
15
16SYM (memchr):
17#ifdef __iamcu__
18	pushl	edi
19	movl	eax,edi
20	movl	edx,eax
21	xorl	edx,edx
22	testl	ecx,ecx
23	jz	L20
24
25	repnz
26	scasb
27
28	setnz	dl
29	decl	edi
30
31	decl	edx
32	andl	edi,edx
33L20:
34	movl	edx,eax
35
36	popl	edi
37#else
38	pushl	ebp
39	movl	esp,ebp
40	pushl	edi
41	movzbl	12(ebp),eax
42	movl	16(ebp),ecx
43	movl	8(ebp),edi
44	xorl	edx,edx
45	testl	ecx,ecx
46	jz	L20
47
48#ifdef __OPTIMIZE_SIZE__
49
50	cld
51	repnz
52	scasb
53
54	setnz	dl
55	decl	edi
56
57#else /* !__OPTIMIZE_SIZE__ */
58/* Do byte-wise checks until string is aligned.  */
59	testl	$3,edi
60	je	L5
61	cmpb	(edi),al
62	je	L15
63	incl	edi
64	decl	ecx
65	je	L20
66
67	testl	$3,edi
68	je	L5
69	cmpb	(edi),al
70	je	L15
71	incl	edi
72	decl	ecx
73	je	L20
74
75	testl	$3,edi
76	je	L5
77	cmpb	(edi),al
78	je	L15
79	incl	edi
80	decl	ecx
81	je	L20
82
83/* Create a mask, then check a word at a time.  */
84L5:
85	movb	al,ah
86	movl	eax,edx
87	sall	$16,edx
88	orl	edx,eax
89	pushl	ebx
90
91	.p2align 4,,7
92L8:
93	subl	$4,ecx
94	jc	L9
95	movl	(edi),edx
96	addl	$4,edi
97	xorl	eax,edx
98	leal	-16843009(edx),ebx
99	notl	edx
100	andl	edx,ebx
101	testl	$-2139062144,ebx
102	je	L8
103
104	subl	$4,edi
105
106L9:
107	popl	ebx
108	xorl	edx,edx
109	addl	$4,ecx
110	je	L20
111
112/* Final byte-wise checks.  */
113	.p2align 4,,7
114L10:
115	cmpb	(edi),al
116	je	L15
117	incl	edi
118	decl	ecx
119	jne	L10
120
121	xorl	edi,edi
122
123#endif /* !__OPTIMIZE_SIZE__ */
124
125L15:
126	decl	edx
127	andl	edi,edx
128L20:
129	movl	edx,eax
130
131	leal	-4(ebp),esp
132	popl	edi
133	leave
134#endif
135	ret
136
137#if defined(__linux__) && defined(__ELF__)
138.section .note.GNU-stack,"",%progbits
139#endif
140