xref: /illumos-gate/usr/src/lib/libc/amd64/gen/wslen.S (revision 55fea89d)
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
279a70fc3bSMark J. Nelson	.file	"wslen.s"
287c478bd9Sstevel@tonic-gate
297c478bd9Sstevel@tonic-gate/*
307c478bd9Sstevel@tonic-gate * Wide character wcslen() implementation
317c478bd9Sstevel@tonic-gate *
327c478bd9Sstevel@tonic-gate * size_t
337257d1b4Sraf * wcslen(const wchar_t *s)
347c478bd9Sstevel@tonic-gate *{
357c478bd9Sstevel@tonic-gate *	const wchar_t *s0 = s + 1;
367c478bd9Sstevel@tonic-gate *	while (*s++)
377c478bd9Sstevel@tonic-gate *		;
387c478bd9Sstevel@tonic-gate *	return (s - s0);
397c478bd9Sstevel@tonic-gate *}
40*55fea89dSDan Cross */
417c478bd9Sstevel@tonic-gate
427c478bd9Sstevel@tonic-gate#include <sys/asm_linkage.h>
437c478bd9Sstevel@tonic-gate
447c478bd9Sstevel@tonic-gate	ANSI_PRAGMA_WEAK(wcslen,function)
457c478bd9Sstevel@tonic-gate	ANSI_PRAGMA_WEAK(wslen,function)
467c478bd9Sstevel@tonic-gate
477257d1b4Sraf	ENTRY(wcslen)		/* (wchar_t *) */
487c478bd9Sstevel@tonic-gate	xorl	%eax,%eax
497c478bd9Sstevel@tonic-gate
507c478bd9Sstevel@tonic-gate	.align	8
517c478bd9Sstevel@tonic-gate.loop:
527c478bd9Sstevel@tonic-gate	cmpl	$0,(%rdi)
537c478bd9Sstevel@tonic-gate	je	.out0
547c478bd9Sstevel@tonic-gate	cmpl	$0,4(%rdi)
557c478bd9Sstevel@tonic-gate	je	.out1
567c478bd9Sstevel@tonic-gate	cmpl	$0,8(%rdi)
577c478bd9Sstevel@tonic-gate	je	.out2
587c478bd9Sstevel@tonic-gate	cmpl	$0,12(%rdi)
597c478bd9Sstevel@tonic-gate	je	.out3
607c478bd9Sstevel@tonic-gate	addq	$4,%rax
617c478bd9Sstevel@tonic-gate	addq	$16,%rdi
627c478bd9Sstevel@tonic-gate	jmp	.loop
637c478bd9Sstevel@tonic-gate
647c478bd9Sstevel@tonic-gate	.align	4
657c478bd9Sstevel@tonic-gate.out1:
667c478bd9Sstevel@tonic-gate	incq	%rax
67*55fea89dSDan Cross.out0:
687c478bd9Sstevel@tonic-gate	ret
69*55fea89dSDan Cross
707c478bd9Sstevel@tonic-gate	.align	4
717c478bd9Sstevel@tonic-gate.out2:
727c478bd9Sstevel@tonic-gate	addq	$2,%rax
737c478bd9Sstevel@tonic-gate	ret
747c478bd9Sstevel@tonic-gate
75*55fea89dSDan Cross	.align	4
767c478bd9Sstevel@tonic-gate.out3:
777c478bd9Sstevel@tonic-gate	addq	$3, %rax
78*55fea89dSDan Cross	ret
797257d1b4Sraf	SET_SIZE(wcslen)
807c478bd9Sstevel@tonic-gate
817257d1b4Sraf	ENTRY(wslen)
827257d1b4Sraf	jmp	wcslen		/ tail call into wcslen
837257d1b4Sraf	SET_SIZE(wslen)
84