diff options
author | Jeff Johnston <jjohnstn@redhat.com> | 2008-02-11 22:14:46 +0000 |
---|---|---|
committer | Jeff Johnston <jjohnstn@redhat.com> | 2008-02-11 22:14:46 +0000 |
commit | 9b924fc304a2b7a361a0614f0eb575e61b9c7f5a (patch) | |
tree | 7e966bfdfe0efac1b4cdb4895e44da526c2b4472 | |
parent | dbc81478fa8ed4a6604beb612ec38a90fc9cd820 (diff) | |
download | newlib-9b924fc304a2b7a361a0614f0eb575e61b9c7f5a.zip newlib-9b924fc304a2b7a361a0614f0eb575e61b9c7f5a.tar.gz newlib-9b924fc304a2b7a361a0614f0eb575e61b9c7f5a.tar.bz2 |
2008-02-11 Patrick Mansfield <patmans@us.ibm.com>
* libc/machine/spu/strlen.c: Remove the len variable and unneeded
calculation of its value.
-rw-r--r-- | newlib/ChangeLog | 5 | ||||
-rw-r--r-- | newlib/libc/machine/spu/strlen.c | 22 |
2 files changed, 17 insertions, 10 deletions
diff --git a/newlib/ChangeLog b/newlib/ChangeLog index 8501c00..90b13d7 100644 --- a/newlib/ChangeLog +++ b/newlib/ChangeLog @@ -1,3 +1,8 @@ +2008-02-11 Patrick Mansfield <patmans@us.ibm.com> + + * libc/machine/spu/strlen.c: Remove the len variable and unneeded + calculation of its value. + 2008-01-25 Hans-Peter Nilsson <hp@bitrange.com> * libc/sys/mmixware/isatty.c (_isatty): Renamed from isatty. diff --git a/newlib/libc/machine/spu/strlen.c b/newlib/libc/machine/spu/strlen.c index 8a7ae07..a8403e0 100644 --- a/newlib/libc/machine/spu/strlen.c +++ b/newlib/libc/machine/spu/strlen.c @@ -33,34 +33,36 @@ #include <spu_intrinsics.h> #include <stddef.h> -/* Calculates the length of the string s, not including the terminating +/* + * Calculates the length of the string s, not including the terminating * \0 character. */ size_t strlen(const char *s) { - size_t len; unsigned int cnt, cmp, skip, mask; vec_uchar16 *ptr, data; - /* Compensate for initial mis-aligned string. + /* + * Compensate for initial mis-aligned string. */ - ptr = (vec_uchar16 *)s; + ptr = (vec_uchar16 *)s; /* implicit 16 byte alignment when dereferenced */ skip = (unsigned int)(ptr) & 15; mask = 0xFFFF >> skip; - data = *ptr++; + data = *ptr; cmp = spu_extract(spu_gather(spu_cmpeq(data, 0)), 0); cmp &= mask; cnt = spu_extract(spu_cntlz(spu_promote(cmp, 0)), 0); - len = cnt - (skip + 16); while (cnt == 32) { - data = *ptr++; - len -= 16; + data = *++ptr; cnt = spu_extract(spu_cntlz(spu_gather(spu_cmpeq(data, 0))), 0); - len += cnt; } - return (len); + /* + * The length is ptr aligned down to a 16 byte boundary, plus the offset + * to the zero byte, minus the starting address s. + */ + return ((((int) ptr & ~0xf) + (cnt - 16)) - (int) s); } |