1/* 2 * CDDL HEADER START 3 * 4 * The contents of this file are subject to the terms of the 5 * Common Development and Distribution License (the "License"). 6 * You may not use this file except in compliance with the License. 7 * 8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9 * or http://www.opensolaris.org/os/licensing. 10 * See the License for the specific language governing permissions 11 * and limitations under the License. 12 * 13 * When distributing Covered Code, include this CDDL HEADER in each 14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15 * If applicable, add the following below this CDDL HEADER, with the 16 * fields enclosed by brackets "[]" replaced with your own identifying 17 * information: Portions Copyright [yyyy] [name of copyright owner] 18 * 19 * CDDL HEADER END 20 */ 21 22/* 23 * Copyright 2008 Sun Microsystems, Inc. All rights reserved. 24 * Use is subject to license terms. 25 */ 26 27 .file "wslen.s" 28 29/* 30 * Wide character wcslen() implementation 31 * 32 * size_t 33 * wcslen(const wchar_t *s) 34 *{ 35 * const wchar_t *s0 = s + 1; 36 * while (*s++) 37 * ; 38 * return (s - s0); 39 *} 40 */ 41 42#include <sys/asm_linkage.h> 43 44 ANSI_PRAGMA_WEAK(wcslen,function) 45 ANSI_PRAGMA_WEAK(wslen,function) 46 47 ENTRY(wcslen) /* (wchar_t *) */ 48 xorl %eax,%eax 49 50 .align 8 51.loop: 52 cmpl $0,(%rdi) 53 je .out0 54 cmpl $0,4(%rdi) 55 je .out1 56 cmpl $0,8(%rdi) 57 je .out2 58 cmpl $0,12(%rdi) 59 je .out3 60 addq $4,%rax 61 addq $16,%rdi 62 jmp .loop 63 64 .align 4 65.out1: 66 incq %rax 67.out0: 68 ret 69 70 .align 4 71.out2: 72 addq $2,%rax 73 ret 74 75 .align 4 76.out3: 77 addq $3, %rax 78 ret 79 SET_SIZE(wcslen) 80 81 ENTRY(wslen) 82 jmp wcslen / tail call into wcslen 83 SET_SIZE(wslen) 84