xref: /openbsd-src/sys/lib/libkern/arch/i386/strcmp.S (revision fd2290cc5695d794a785106a82a79466f6b1f962)
1*fd2290ccSmickey/*	$OpenBSD: strcmp.S,v 1.2 1996/09/27 06:47:49 mickey Exp $	*/
2*fd2290ccSmickey
3df930be7Sderaadt/*
4df930be7Sderaadt * Written by J.T. Conklin <jtc@netbsd.org>.
5df930be7Sderaadt * Public domain.
6df930be7Sderaadt */
7df930be7Sderaadt
8df930be7Sderaadt#include <machine/asm.h>
9df930be7Sderaadt
10df930be7Sderaadt/*
11df930be7Sderaadt * NOTE: I've unrolled the loop eight times: large enough to make a
12df930be7Sderaadt * significant difference, and small enough not to totally trash the
13df930be7Sderaadt * cache.
14df930be7Sderaadt */
15df930be7Sderaadt
16df930be7SderaadtENTRY(strcmp)
17df930be7Sderaadt	movl	0x04(%esp),%eax
18df930be7Sderaadt	movl	0x08(%esp),%edx
19df930be7Sderaadt	jmp	L2			/* Jump into the loop! */
20df930be7Sderaadt
21df930be7Sderaadt	.align	2,0x90
22df930be7SderaadtL1:	incl	%eax
23df930be7Sderaadt	incl	%edx
24df930be7SderaadtL2:	movb	(%eax),%cl
25df930be7Sderaadt	testb	%cl,%cl			/* null terminator??? */
26df930be7Sderaadt	jz	L3
27df930be7Sderaadt	cmpb	%cl,(%edx)		/* chars match??? */
28df930be7Sderaadt	jne	L3
29df930be7Sderaadt	incl	%eax
30df930be7Sderaadt	incl	%edx
31df930be7Sderaadt	movb	(%eax),%cl
32df930be7Sderaadt	testb	%cl,%cl
33df930be7Sderaadt	jz	L3
34df930be7Sderaadt	cmpb	%cl,(%edx)
35df930be7Sderaadt	jne	L3
36df930be7Sderaadt	incl	%eax
37df930be7Sderaadt	incl	%edx
38df930be7Sderaadt	movb	(%eax),%cl
39df930be7Sderaadt	testb	%cl,%cl
40df930be7Sderaadt	jz	L3
41df930be7Sderaadt	cmpb	%cl,(%edx)
42df930be7Sderaadt	jne	L3
43df930be7Sderaadt	incl	%eax
44df930be7Sderaadt	incl	%edx
45df930be7Sderaadt	movb	(%eax),%cl
46df930be7Sderaadt	testb	%cl,%cl
47df930be7Sderaadt	jz	L3
48df930be7Sderaadt	cmpb	%cl,(%edx)
49df930be7Sderaadt	jne	L3
50df930be7Sderaadt	incl	%eax
51df930be7Sderaadt	incl	%edx
52df930be7Sderaadt	movb	(%eax),%cl
53df930be7Sderaadt	testb	%cl,%cl
54df930be7Sderaadt	jz	L3
55df930be7Sderaadt	cmpb	%cl,(%edx)
56df930be7Sderaadt	jne	L3
57df930be7Sderaadt	incl	%eax
58df930be7Sderaadt	incl	%edx
59df930be7Sderaadt	movb	(%eax),%cl
60df930be7Sderaadt	testb	%cl,%cl
61df930be7Sderaadt	jz	L3
62df930be7Sderaadt	cmpb	%cl,(%edx)
63df930be7Sderaadt	jne	L3
64df930be7Sderaadt	incl	%eax
65df930be7Sderaadt	incl	%edx
66df930be7Sderaadt	movb	(%eax),%cl
67df930be7Sderaadt	testb	%cl,%cl
68df930be7Sderaadt	jz	L3
69df930be7Sderaadt	cmpb	%cl,(%edx)
70df930be7Sderaadt	jne	L3
71df930be7Sderaadt	incl	%eax
72df930be7Sderaadt	incl	%edx
73df930be7Sderaadt	movb	(%eax),%cl
74df930be7Sderaadt	testb	%cl,%cl
75df930be7Sderaadt	jz	L3
76df930be7Sderaadt	cmpb	%cl,(%edx)
77df930be7Sderaadt	je	L1
78df930be7Sderaadt	.align 2, 0x90
79df930be7SderaadtL3:	movzbl	(%eax),%eax		/* unsigned comparison */
80df930be7Sderaadt	movzbl	(%edx),%edx
81df930be7Sderaadt	subl	%edx,%eax
82df930be7Sderaadt	ret
83