xref: /netbsd-src/lib/libc/arch/x86_64/string/strncmp.S (revision 92d1d4411b9f8cbaff3d5eb0b336fcc1c32deb29)
1/*
2 * Written by J.T. Conklin <jtc@NetBSD.org>.
3 * Public domain.
4 */
5
6#include <machine/asm.h>
7
8#if defined(LIBC_SCCS)
9        RCSID("$NetBSD: strncmp.S,v 1.4 2014/05/22 15:01:57 uebayasi Exp $")
10#endif
11
12/*
13 * NOTE: I've unrolled the loop eight times: large enough to make a
14 * significant difference, and small enough not to totally trash the
15 * cache.
16 */
17
18ENTRY(strncmp)
19	testq	%rdx,%rdx
20	jmp	L2			/* Jump into the loop! */
21
22L1:	incq	%rdi
23	incq	%rsi
24	decq	%rdx
25L2:	jz	L4			/* strings are equal */
26	movb	(%rdi),%al
27	testb	%al,%al
28	jz	L3
29	cmpb	%al,(%rsi)
30	jne	L3
31
32	incq	%rdi
33	incq	%rsi
34	decq	%rdx
35	jz	L4
36	movb	(%rdi),%al
37	testb	%al,%al
38	jz	L3
39	cmpb	%al,(%rsi)
40	jne	L3
41
42	incq	%rdi
43	incq	%rsi
44	decq	%rdx
45	jz	L4
46	movb	(%rdi),%al
47	testb	%al,%al
48	jz	L3
49	cmpb	%al,(%rsi)
50	jne	L3
51
52	incq	%rdi
53	incq	%rsi
54	decq	%rdx
55	jz	L4
56	movb	(%rdi),%al
57	testb	%al,%al
58	jz	L3
59	cmpb	%al,(%rsi)
60	jne	L3
61
62	incq	%rdi
63	incq	%rsi
64	decq	%rdx
65	jz	L4
66	movb	(%rdi),%al
67	testb	%al,%al
68	jz	L3
69	cmpb	%al,(%rsi)
70	jne	L3
71
72	incq	%rdi
73	incq	%rsi
74	decq	%rdx
75	jz	L4
76	movb	(%rdi),%al
77	testb	%al,%al
78	jz	L3
79	cmpb	%al,(%rsi)
80	jne	L3
81
82	incq	%rdi
83	incq	%rsi
84	decq	%rdx
85	jz	L4
86	movb	(%rdi),%al
87	testb	%al,%al
88	jz	L3
89	cmpb	%al,(%rsi)
90	jne	L3
91
92	incq	%rdi
93	incq	%rsi
94	decq	%rdx
95	jz	L4
96	movb	(%rdi),%al
97	testb	%al,%al
98	jz	L3
99	cmpb	%al,(%rsi)
100	je	L1
101
102L3:	movzbl	(%rdi),%eax		/* unsigned comparison */
103	movzbl	(%rsi),%ecx
104	subl	%ecx,%eax
105	ret
106L4:	xorl	%eax,%eax
107	ret
108END(strncmp)
109