xref: /titanic_51/usr/src/lib/libc/i386/gen/strncmp.s (revision 9a70fc3be3b1e966bf78825cdb8d509963a6f0a1)
17c478bd9Sstevel@tonic-gate/*
27c478bd9Sstevel@tonic-gate * CDDL HEADER START
37c478bd9Sstevel@tonic-gate *
47c478bd9Sstevel@tonic-gate * The contents of this file are subject to the terms of the
5*9a70fc3bSMark J. Nelson * Common Development and Distribution License (the "License").
6*9a70fc3bSMark J. Nelson * You may not use this file except in compliance with the License.
77c478bd9Sstevel@tonic-gate *
87c478bd9Sstevel@tonic-gate * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
97c478bd9Sstevel@tonic-gate * or http://www.opensolaris.org/os/licensing.
107c478bd9Sstevel@tonic-gate * See the License for the specific language governing permissions
117c478bd9Sstevel@tonic-gate * and limitations under the License.
127c478bd9Sstevel@tonic-gate *
137c478bd9Sstevel@tonic-gate * When distributing Covered Code, include this CDDL HEADER in each
147c478bd9Sstevel@tonic-gate * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
157c478bd9Sstevel@tonic-gate * If applicable, add the following below this CDDL HEADER, with the
167c478bd9Sstevel@tonic-gate * fields enclosed by brackets "[]" replaced with your own identifying
177c478bd9Sstevel@tonic-gate * information: Portions Copyright [yyyy] [name of copyright owner]
187c478bd9Sstevel@tonic-gate *
197c478bd9Sstevel@tonic-gate * CDDL HEADER END
207c478bd9Sstevel@tonic-gate */
217c478bd9Sstevel@tonic-gate/*
227c478bd9Sstevel@tonic-gate * Copyright 2004 Sun Microsystems, Inc.  All rights reserved.
237c478bd9Sstevel@tonic-gate * Use is subject to license terms.
247c478bd9Sstevel@tonic-gate */
257c478bd9Sstevel@tonic-gate
26*9a70fc3bSMark J. Nelson	.file	"strncmp.s"
277c478bd9Sstevel@tonic-gate
287c478bd9Sstevel@tonic-gate#include "SYS.h"
297c478bd9Sstevel@tonic-gate
307c478bd9Sstevel@tonic-gate	ENTRY(strncmp)
317c478bd9Sstevel@tonic-gate	pushl	%esi		/ save register variables
327c478bd9Sstevel@tonic-gate	movl	8(%esp),%esi	/ %esi = first string
337c478bd9Sstevel@tonic-gate	movl	%edi,%edx
347c478bd9Sstevel@tonic-gate	movl	12(%esp),%edi	/ %edi = second string
357c478bd9Sstevel@tonic-gate	cmpl	%esi,%edi	/ same string?
367c478bd9Sstevel@tonic-gate	je	.equal
377c478bd9Sstevel@tonic-gate	movl	16(%esp),%ecx	/ %ecx = length
387c478bd9Sstevel@tonic-gate	incl	%ecx		/ will later predecrement this uint
397c478bd9Sstevel@tonic-gate.loop:
407c478bd9Sstevel@tonic-gate	decl	%ecx
417c478bd9Sstevel@tonic-gate	je	.equal		/ Used all n chars?
427c478bd9Sstevel@tonic-gate	movb	(%esi),%al	/ slodb ; scab
437c478bd9Sstevel@tonic-gate	cmpb	(%edi),%al
447c478bd9Sstevel@tonic-gate	jne	.notequal_0	/ Are the bytes equal?
457c478bd9Sstevel@tonic-gate	testb	%al,%al
467c478bd9Sstevel@tonic-gate	je	.equal		/ End of string?
477c478bd9Sstevel@tonic-gate
487c478bd9Sstevel@tonic-gate	decl	%ecx
497c478bd9Sstevel@tonic-gate	je	.equal		/ Used all n chars?
507c478bd9Sstevel@tonic-gate	movb	1(%esi),%al	/ slodb ; scab
517c478bd9Sstevel@tonic-gate	cmpb	1(%edi),%al
527c478bd9Sstevel@tonic-gate	jne	.notequal_1	/ Are the bytes equal?
537c478bd9Sstevel@tonic-gate	testb	%al,%al
547c478bd9Sstevel@tonic-gate	je	.equal		/ End of string?
557c478bd9Sstevel@tonic-gate
567c478bd9Sstevel@tonic-gate	decl	%ecx
577c478bd9Sstevel@tonic-gate	je	.equal		/ Used all n chars?
587c478bd9Sstevel@tonic-gate	movb	2(%esi),%al	/ slodb ; scab
597c478bd9Sstevel@tonic-gate	cmpb	2(%edi),%al
607c478bd9Sstevel@tonic-gate	jne	.notequal_2	/ Are the bytes equal?
617c478bd9Sstevel@tonic-gate	testb	%al,%al
627c478bd9Sstevel@tonic-gate	je	.equal		/ End of string?
637c478bd9Sstevel@tonic-gate
647c478bd9Sstevel@tonic-gate	decl	%ecx
657c478bd9Sstevel@tonic-gate	je	.equal		/ Used all n chars?
667c478bd9Sstevel@tonic-gate	movb	3(%esi),%al	/ slodb ; scab
677c478bd9Sstevel@tonic-gate	cmpb	3(%edi),%al
687c478bd9Sstevel@tonic-gate	jne	.notequal_3	/ Are the bytes equal?
697c478bd9Sstevel@tonic-gate	addl	$4,%esi
707c478bd9Sstevel@tonic-gate	addl	$4,%edi
717c478bd9Sstevel@tonic-gate	testb	%al,%al
727c478bd9Sstevel@tonic-gate	jne	.loop		/ End of string?
737c478bd9Sstevel@tonic-gate
747c478bd9Sstevel@tonic-gate.equal:
757c478bd9Sstevel@tonic-gate	popl	%esi		/ restore registers
767c478bd9Sstevel@tonic-gate	xorl	%eax,%eax	/ return 0
777c478bd9Sstevel@tonic-gate	movl	%edx,%edi
787c478bd9Sstevel@tonic-gate	ret
797c478bd9Sstevel@tonic-gate
807c478bd9Sstevel@tonic-gate	.align	4
817c478bd9Sstevel@tonic-gate.notequal_3:
827c478bd9Sstevel@tonic-gate	incl	%edi
837c478bd9Sstevel@tonic-gate.notequal_2:
847c478bd9Sstevel@tonic-gate	incl	%edi
857c478bd9Sstevel@tonic-gate.notequal_1:
867c478bd9Sstevel@tonic-gate	incl	%edi
877c478bd9Sstevel@tonic-gate.notequal_0:
887c478bd9Sstevel@tonic-gate	popl	%esi		/ restore registers
897c478bd9Sstevel@tonic-gate	clc			/ clear carry bit
907c478bd9Sstevel@tonic-gate	subb	(%edi),%al
917c478bd9Sstevel@tonic-gate	movl	%edx,%edi
927c478bd9Sstevel@tonic-gate	movl	$-1, %eax	/ possibly wasted instr
937c478bd9Sstevel@tonic-gate	jc	.neg		/ did we overflow in the sub
947c478bd9Sstevel@tonic-gate	movl	$1, %eax	/ if not a > b
957c478bd9Sstevel@tonic-gate.neg:
967c478bd9Sstevel@tonic-gate	ret
977c478bd9Sstevel@tonic-gate	SET_SIZE(strncmp)
98