xref: /illumos-gate/usr/src/lib/libc/i386/gen/strncmp.S (revision 55fea89dcaa64928bed4327112404dcb3e07b79f)
1*5d9d9091SRichard Lowe/*
2*5d9d9091SRichard Lowe * CDDL HEADER START
3*5d9d9091SRichard Lowe *
4*5d9d9091SRichard Lowe * The contents of this file are subject to the terms of the
5*5d9d9091SRichard Lowe * Common Development and Distribution License (the "License").
6*5d9d9091SRichard Lowe * You may not use this file except in compliance with the License.
7*5d9d9091SRichard Lowe *
8*5d9d9091SRichard Lowe * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9*5d9d9091SRichard Lowe * or http://www.opensolaris.org/os/licensing.
10*5d9d9091SRichard Lowe * See the License for the specific language governing permissions
11*5d9d9091SRichard Lowe * and limitations under the License.
12*5d9d9091SRichard Lowe *
13*5d9d9091SRichard Lowe * When distributing Covered Code, include this CDDL HEADER in each
14*5d9d9091SRichard Lowe * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15*5d9d9091SRichard Lowe * If applicable, add the following below this CDDL HEADER, with the
16*5d9d9091SRichard Lowe * fields enclosed by brackets "[]" replaced with your own identifying
17*5d9d9091SRichard Lowe * information: Portions Copyright [yyyy] [name of copyright owner]
18*5d9d9091SRichard Lowe *
19*5d9d9091SRichard Lowe * CDDL HEADER END
20*5d9d9091SRichard Lowe */
21*5d9d9091SRichard Lowe/*
22*5d9d9091SRichard Lowe * Copyright 2004 Sun Microsystems, Inc.  All rights reserved.
23*5d9d9091SRichard Lowe * Use is subject to license terms.
24*5d9d9091SRichard Lowe */
25*5d9d9091SRichard Lowe
26*5d9d9091SRichard Lowe	.file	"strncmp.s"
27*5d9d9091SRichard Lowe
28*5d9d9091SRichard Lowe#include "SYS.h"
29*5d9d9091SRichard Lowe
30*5d9d9091SRichard Lowe	ENTRY(strncmp)
31*5d9d9091SRichard Lowe	pushl	%esi		/ save register variables
32*5d9d9091SRichard Lowe	movl	8(%esp),%esi	/ %esi = first string
33*5d9d9091SRichard Lowe	movl	%edi,%edx
34*5d9d9091SRichard Lowe	movl	12(%esp),%edi	/ %edi = second string
35*5d9d9091SRichard Lowe	cmpl	%esi,%edi	/ same string?
36*5d9d9091SRichard Lowe	je	.equal
37*5d9d9091SRichard Lowe	movl	16(%esp),%ecx	/ %ecx = length
38*5d9d9091SRichard Lowe	incl	%ecx		/ will later predecrement this uint
39*5d9d9091SRichard Lowe.loop:
40*5d9d9091SRichard Lowe	decl	%ecx
41*5d9d9091SRichard Lowe	je	.equal		/ Used all n chars?
42*5d9d9091SRichard Lowe	movb	(%esi),%al	/ slodb ; scab
43*5d9d9091SRichard Lowe	cmpb	(%edi),%al
44*5d9d9091SRichard Lowe	jne	.notequal_0	/ Are the bytes equal?
45*5d9d9091SRichard Lowe	testb	%al,%al
46*5d9d9091SRichard Lowe	je	.equal		/ End of string?
47*5d9d9091SRichard Lowe
48*5d9d9091SRichard Lowe	decl	%ecx
49*5d9d9091SRichard Lowe	je	.equal		/ Used all n chars?
50*5d9d9091SRichard Lowe	movb	1(%esi),%al	/ slodb ; scab
51*5d9d9091SRichard Lowe	cmpb	1(%edi),%al
52*5d9d9091SRichard Lowe	jne	.notequal_1	/ Are the bytes equal?
53*5d9d9091SRichard Lowe	testb	%al,%al
54*5d9d9091SRichard Lowe	je	.equal		/ End of string?
55*5d9d9091SRichard Lowe
56*5d9d9091SRichard Lowe	decl	%ecx
57*5d9d9091SRichard Lowe	je	.equal		/ Used all n chars?
58*5d9d9091SRichard Lowe	movb	2(%esi),%al	/ slodb ; scab
59*5d9d9091SRichard Lowe	cmpb	2(%edi),%al
60*5d9d9091SRichard Lowe	jne	.notequal_2	/ Are the bytes equal?
61*5d9d9091SRichard Lowe	testb	%al,%al
62*5d9d9091SRichard Lowe	je	.equal		/ End of string?
63*5d9d9091SRichard Lowe
64*5d9d9091SRichard Lowe	decl	%ecx
65*5d9d9091SRichard Lowe	je	.equal		/ Used all n chars?
66*5d9d9091SRichard Lowe	movb	3(%esi),%al	/ slodb ; scab
67*5d9d9091SRichard Lowe	cmpb	3(%edi),%al
68*5d9d9091SRichard Lowe	jne	.notequal_3	/ Are the bytes equal?
69*5d9d9091SRichard Lowe	addl	$4,%esi
70*5d9d9091SRichard Lowe	addl	$4,%edi
71*5d9d9091SRichard Lowe	testb	%al,%al
72*5d9d9091SRichard Lowe	jne	.loop		/ End of string?
73*5d9d9091SRichard Lowe
74*5d9d9091SRichard Lowe.equal:
75*5d9d9091SRichard Lowe	popl	%esi		/ restore registers
76*5d9d9091SRichard Lowe	xorl	%eax,%eax	/ return 0
77*5d9d9091SRichard Lowe	movl	%edx,%edi
78*5d9d9091SRichard Lowe	ret
79*5d9d9091SRichard Lowe
80*5d9d9091SRichard Lowe	.align	4
81*5d9d9091SRichard Lowe.notequal_3:
82*5d9d9091SRichard Lowe	incl	%edi
83*5d9d9091SRichard Lowe.notequal_2:
84*5d9d9091SRichard Lowe	incl	%edi
85*5d9d9091SRichard Lowe.notequal_1:
86*5d9d9091SRichard Lowe	incl	%edi
87*5d9d9091SRichard Lowe.notequal_0:
88*5d9d9091SRichard Lowe	popl	%esi		/ restore registers
89*5d9d9091SRichard Lowe	clc			/ clear carry bit
90*5d9d9091SRichard Lowe	subb	(%edi),%al
91*5d9d9091SRichard Lowe	movl	%edx,%edi
92*5d9d9091SRichard Lowe	movl	$-1, %eax	/ possibly wasted instr
93*5d9d9091SRichard Lowe	jc	.neg		/ did we overflow in the sub
94*5d9d9091SRichard Lowe	movl	$1, %eax	/ if not a > b
95*5d9d9091SRichard Lowe.neg:
96*5d9d9091SRichard Lowe	ret
97*5d9d9091SRichard Lowe	SET_SIZE(strncmp)
98