diff options
Diffstat (limited to 'newlib/libc/machine/spu/strncpy.c')
-rw-r--r-- | newlib/libc/machine/spu/strncpy.c | 59 |
1 files changed, 7 insertions, 52 deletions
diff --git a/newlib/libc/machine/spu/strncpy.c b/newlib/libc/machine/spu/strncpy.c index 334c3bb6c..9c70b0401 100644 --- a/newlib/libc/machine/spu/strncpy.c +++ b/newlib/libc/machine/spu/strncpy.c @@ -1,9 +1,6 @@ /* - (C) Copyright 2001,2006, + (C) Copyright 2008 International Business Machines Corporation, - Sony Computer Entertainment, Incorporated, - Toshiba Corporation, - All rights reserved. Redistribution and use in source and binary forms, with or without @@ -30,58 +27,16 @@ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -#include <spu_intrinsics.h> #include <stddef.h> #include <string.h> +#include "strcpy.h" -/* Copy the string up to n character from memory area src to - * memory area dest. The memory areas may not overlap. The - * strncpy subroutine returns a pointer to dest. +/* + * Copy the string up to n character from memory area src to memory area + * dest. The memory areas may not overlap. The strncpy subroutine returns + * a pointer to dest. */ char * strncpy(char * __restrict__ dest, const char * __restrict__ src, size_t n) { - unsigned int len; - unsigned int cmp, skip, mask; - vec_uchar16 *ptr, data; - vec_uint4 cnt, gt, N; - - N = spu_promote((unsigned int)n, 0); - - /* Determine the string length, including termination character, - * clamped to n characters. - */ - ptr = (vec_uchar16 *)src; - skip = (unsigned int)(ptr) & 15; - mask = 0xFFFF >> skip; - - data = *ptr++; - cmp = spu_extract(spu_gather(spu_cmpeq(data, 0)), 0); - cmp &= mask; - - cnt = spu_cntlz(spu_promote(cmp, 0)); - len = spu_extract(cnt, 0) - (skip + 15); - - gt = spu_cmpgt(spu_promote(len, 0), N); - - while (spu_extract(spu_andc(spu_cmpeq(cnt, 32), gt), 0)) { - data = *ptr++; - len -= 16; - cnt = spu_cntlz(spu_gather(spu_cmpeq(data, 0))); - len += spu_extract(cnt, 0); - - gt = spu_cmpgt(spu_promote(len, 0), N); - } - - /* len = MIN(len, n) - */ - len = spu_extract(spu_sel(spu_promote((unsigned int)len, 0), N, gt), 0); - - /* Padding - */ - if (len != n) { - memset(dest + len, 0, n - len); - } - /* Perform a memcpy of the resulting length - */ - return ((char *)memcpy((void *)dest, (const void *)src, len)); + return _strncpy(dest, src, n, 1, 0); } |