summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJeff Johnston <jjohnstn@redhat.com>2008-02-11 22:14:46 +0000
committerJeff Johnston <jjohnstn@redhat.com>2008-02-11 22:14:46 +0000
commit9b924fc304a2b7a361a0614f0eb575e61b9c7f5a (patch)
tree7e966bfdfe0efac1b4cdb4895e44da526c2b4472
parentdbc81478fa8ed4a6604beb612ec38a90fc9cd820 (diff)
downloadcygnal-9b924fc304a2b7a361a0614f0eb575e61b9c7f5a.tar.gz
cygnal-9b924fc304a2b7a361a0614f0eb575e61b9c7f5a.tar.bz2
cygnal-9b924fc304a2b7a361a0614f0eb575e61b9c7f5a.zip
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/ChangeLog5
-rw-r--r--newlib/libc/machine/spu/strlen.c22
2 files changed, 17 insertions, 10 deletions
diff --git a/newlib/ChangeLog b/newlib/ChangeLog
index 8501c00b5..90b13d764 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 8a7ae07ab..a8403e045 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);
}