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 57257d1b4Sraf * Common Development and Distribution License (the "License"). 67257d1b4Sraf * 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 */ 217257d1b4Sraf 227c478bd9Sstevel@tonic-gate/* 237257d1b4Sraf * Copyright 2008 Sun Microsystems, Inc. All rights reserved. 247c478bd9Sstevel@tonic-gate * Use is subject to license terms. 257c478bd9Sstevel@tonic-gate */ 267c478bd9Sstevel@tonic-gate 27*9a70fc3bSMark J. Nelson .file "wsncmp.s" 287c478bd9Sstevel@tonic-gate 297c478bd9Sstevel@tonic-gate/ 307c478bd9Sstevel@tonic-gate/ Wide character wcsncpy() implementation 317c478bd9Sstevel@tonic-gate/ 327c478bd9Sstevel@tonic-gate/ Algorithm based on Solaris 2.6 gen/strncpy.s implementation 337c478bd9Sstevel@tonic-gate/ 347c478bd9Sstevel@tonic-gate 357257d1b4Sraf#include "SYS.h" 367c478bd9Sstevel@tonic-gate 377c478bd9Sstevel@tonic-gate ANSI_PRAGMA_WEAK(wcsncmp,function) 387c478bd9Sstevel@tonic-gate ANSI_PRAGMA_WEAK(wsncmp,function) 397c478bd9Sstevel@tonic-gate 407257d1b4Sraf ENTRY(wcsncmp) 417c478bd9Sstevel@tonic-gate pushl %esi / save register variables 427c478bd9Sstevel@tonic-gate movl 8(%esp),%esi / %esi = first string 437c478bd9Sstevel@tonic-gate movl %edi,%edx 447c478bd9Sstevel@tonic-gate movl 12(%esp),%edi / %edi = second string 457c478bd9Sstevel@tonic-gate cmpl %esi,%edi / same string? 467c478bd9Sstevel@tonic-gate je .equal 477c478bd9Sstevel@tonic-gate movl 16(%esp),%ecx / %ecx = length 487c478bd9Sstevel@tonic-gate incl %ecx / will later predecrement this uint 497c478bd9Sstevel@tonic-gate.loop: 507c478bd9Sstevel@tonic-gate decl %ecx 517c478bd9Sstevel@tonic-gate je .equal / Used all n chars? 527c478bd9Sstevel@tonic-gate movl (%esi),%eax / slodb ; scab 537c478bd9Sstevel@tonic-gate cmpl (%edi),%eax 547c478bd9Sstevel@tonic-gate jne .notequal_0 / Are the bytes equal? 557c478bd9Sstevel@tonic-gate testl %eax,%eax 567c478bd9Sstevel@tonic-gate je .equal / End of string? 577c478bd9Sstevel@tonic-gate 587c478bd9Sstevel@tonic-gate decl %ecx 597c478bd9Sstevel@tonic-gate je .equal / Used all n chars? 607c478bd9Sstevel@tonic-gate movl 4(%esi),%eax / slodb ; scab 617c478bd9Sstevel@tonic-gate cmpl 4(%edi),%eax 627c478bd9Sstevel@tonic-gate jne .notequal_1 / Are the bytes equal? 637c478bd9Sstevel@tonic-gate testl %eax,%eax 647c478bd9Sstevel@tonic-gate je .equal / End of string? 657c478bd9Sstevel@tonic-gate 667c478bd9Sstevel@tonic-gate decl %ecx 677c478bd9Sstevel@tonic-gate je .equal / Used all n chars? 687c478bd9Sstevel@tonic-gate movl 8(%esi),%eax / slodb ; scab 697c478bd9Sstevel@tonic-gate cmpl 8(%edi),%eax 707c478bd9Sstevel@tonic-gate jne .notequal_2 / Are the bytes equal? 717c478bd9Sstevel@tonic-gate testl %eax,%eax 727c478bd9Sstevel@tonic-gate je .equal / End of string? 737c478bd9Sstevel@tonic-gate 747c478bd9Sstevel@tonic-gate decl %ecx 757c478bd9Sstevel@tonic-gate je .equal / Used all n chars? 767c478bd9Sstevel@tonic-gate movl 12(%esi),%eax / slodb ; scab 777c478bd9Sstevel@tonic-gate cmpl 12(%edi),%eax 787c478bd9Sstevel@tonic-gate jne .notequal_3 / Are the bytes equal? 797c478bd9Sstevel@tonic-gate addl $16,%esi 807c478bd9Sstevel@tonic-gate addl $16,%edi 817c478bd9Sstevel@tonic-gate testl %eax,%eax 827c478bd9Sstevel@tonic-gate jne .loop / End of string? 837c478bd9Sstevel@tonic-gate 847c478bd9Sstevel@tonic-gate.equal: 857c478bd9Sstevel@tonic-gate popl %esi / restore registers 867c478bd9Sstevel@tonic-gate xorl %eax,%eax / return 0 877c478bd9Sstevel@tonic-gate movl %edx,%edi 887c478bd9Sstevel@tonic-gate ret 897c478bd9Sstevel@tonic-gate 907c478bd9Sstevel@tonic-gate .align 4 917c478bd9Sstevel@tonic-gate.notequal_3: 927c478bd9Sstevel@tonic-gate addl $4,%edi 937c478bd9Sstevel@tonic-gate.notequal_2: 947c478bd9Sstevel@tonic-gate addl $4,%edi 957c478bd9Sstevel@tonic-gate.notequal_1: 967c478bd9Sstevel@tonic-gate addl $4,%edi 977c478bd9Sstevel@tonic-gate.notequal_0: 987c478bd9Sstevel@tonic-gate popl %esi / restore registers 997c478bd9Sstevel@tonic-gate subl (%edi),%eax / return value is (*s1 - *--s2) 1007c478bd9Sstevel@tonic-gate movl %edx,%edi 1017c478bd9Sstevel@tonic-gate ret 1027257d1b4Sraf SET_SIZE(wcsncmp) 1037c478bd9Sstevel@tonic-gate 1047257d1b4Sraf ENTRY(wsncmp) 1057c478bd9Sstevel@tonic-gate _prologue_ 1067c478bd9Sstevel@tonic-gate movl _esp_(12),%ecx 1077c478bd9Sstevel@tonic-gate movl _esp_(8),%eax 1087c478bd9Sstevel@tonic-gate movl _esp_(4),%edx 1097c478bd9Sstevel@tonic-gate pushl %ecx 1107c478bd9Sstevel@tonic-gate pushl %eax 1117c478bd9Sstevel@tonic-gate pushl %edx 1127257d1b4Sraf call _fref_(wcsncmp) 1137c478bd9Sstevel@tonic-gate addl $12,%esp 1147c478bd9Sstevel@tonic-gate _epilogue_ 1157c478bd9Sstevel@tonic-gate ret 1167257d1b4Sraf SET_SIZE(wsncmp) 117