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