[PATCH] remove unneeded len variable from SPU strlen code
Jeff Johnston
jjohnstn@redhat.com
Mon Feb 11 22:21:00 GMT 2008
Patch applied.
-- Jeff J.
Patrick Mansfield wrote:
> Jeff -
>
> Can you please apply?
>
> Get rid of len variable in strlen code.
>
> This does not change the size or speed of the code for -O2 (it does for
> -O1), but makes the source a bit simpler to read.
>
> newlib/ChangeLog:
>
> 2008-02-11 Patrick Mansfield <patmans@us.ibm.com>
>
> * libc/machine/spu/strlen.c: Remove the len variable and unneeded
> calculation of its value.
>
> Index: src/newlib/libc/machine/spu/strlen.c
> ===================================================================
> --- src.orig/newlib/libc/machine/spu/strlen.c
> +++ src/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);
> }
>
More information about the Newlib
mailing list