2008-02-11 Patrick Mansfield <patmans@us.ibm.com>
* libc/machine/spu/strlen.c: Remove the len variable and unneeded calculation of its value.
This commit is contained in:
parent
dbc81478fa
commit
9b924fc304
|
@ -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.
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue