OSDN Git Service

2008-02-11 Patrick Mansfield <patmans@us.ibm.com>
authorjjohnstn <jjohnstn>
Mon, 11 Feb 2008 22:14:46 +0000 (22:14 +0000)
committerjjohnstn <jjohnstn>
Mon, 11 Feb 2008 22:14:46 +0000 (22:14 +0000)
        * libc/machine/spu/strlen.c: Remove the len variable and unneeded
        calculation of its value.

newlib/ChangeLog
newlib/libc/machine/spu/strlen.c

index 8501c00..90b13d7 100644 (file)
@@ -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.
index 8a7ae07..a8403e0 100644 (file)
 #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);
 }