Commit | Line | Data |
---|---|---|
1da177e4 LT |
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) |