| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 1 | /* | 
 | 2 |  * Returns 0 if exception before NUL or reaching the supplied limit (N), | 
 | 3 |  * a value greater than N if the string is longer than the limit, else | 
 | 4 |  * strlen. | 
 | 5 |  * | 
 | 6 |  * Inputs: | 
 | 7 |  *	in0:	address of buffer | 
 | 8 |  *	in1:	string length limit N | 
 | 9 |  * Outputs: | 
 | 10 |  *	r8:	0 in case of fault, strlen(buffer)+1 otherwise | 
 | 11 |  * | 
 | 12 |  * Copyright (C) 1999, 2001 David Mosberger-Tang <davidm@hpl.hp.com> | 
 | 13 |  */ | 
 | 14 |  | 
 | 15 | #include <asm/asmmacro.h> | 
 | 16 |  | 
 | 17 | GLOBAL_ENTRY(__strnlen_user) | 
 | 18 | 	.prologue | 
 | 19 | 	alloc r2=ar.pfs,2,0,0,0 | 
 | 20 | 	.save ar.lc, r16 | 
 | 21 | 	mov r16=ar.lc			// preserve ar.lc | 
 | 22 |  | 
 | 23 | 	.body | 
 | 24 |  | 
 | 25 | 	add r3=-1,in1 | 
 | 26 | 	;; | 
 | 27 | 	mov ar.lc=r3 | 
 | 28 | 	mov r9=0 | 
 | 29 | 	;; | 
 | 30 | 	// XXX braindead strlen loop---this needs to be optimized | 
 | 31 | .Loop1: | 
 | 32 | 	EXCLR(.Lexit, ld1 r8=[in0],1) | 
 | 33 | 	add r9=1,r9 | 
 | 34 | 	;; | 
 | 35 | 	cmp.eq p6,p0=r8,r0 | 
 | 36 | (p6)	br.cond.dpnt .Lexit | 
 | 37 | 	br.cloop.dptk.few .Loop1 | 
 | 38 |  | 
 | 39 | 	add r9=1,in1			// NUL not found---return N+1 | 
 | 40 | 	;; | 
 | 41 | .Lexit: | 
 | 42 | 	mov r8=r9 | 
 | 43 | 	mov ar.lc=r16			// restore ar.lc | 
 | 44 | 	br.ret.sptk.many rp | 
 | 45 | END(__strnlen_user) |