[U-Boot] [PATCH 2/3] memset: use 32-bit copies if possible

Wolfgang Denk wd at denx.de
Wed Oct 7 11:27:51 CEST 2009


Dear Alessandro Rubini,

In message <d10837d7edf963ce9b0e87773c9771e451f9f9ac.1254904388.git.rubini@ unipv.it> you wrote:
> From: Alessandro Rubini <rubini at unipv.it>
> 
> Signed-off-by: Alessandro Rubini <rubini at unipv.it>
> Acked-by: Andrea Gallo <andrea.gallo at stericsson.com>

Please fix the Subject: memset() does not copy data.

>  lib_generic/string.c |   16 +++++++++++++++-
>  1 files changed, 15 insertions(+), 1 deletions(-)
> 
> diff --git a/lib_generic/string.c b/lib_generic/string.c
> index fdccab6..68e0255 100644
> --- a/lib_generic/string.c
> +++ b/lib_generic/string.c
> @@ -404,7 +404,21 @@ char *strswab(const char *s)
>  void * memset(void * s,int c,size_t count)
>  {
>  	char *xs = (char *) s;
> +	u32 *s32 = (u32 *) s;
> +	int c32 = 0; /* most common case */
>  
> +	/* do it 32 bits at a time if possible */
> +	if ( ((count & 3) | ((int)s & 3)) == 0) {
> +		count /= 4;
> +		if (c) { /* not 0: build 32-bit value */
> +			c32 = c | (c<<8);
> +			c32 |= c32 << 16;

I reject this code, as it changes behaviour. You may argument that
it's only for special cases, but anyway:

Fill pattern	for standard memset()	for your code:
c = -2		0xFEFEFEFE		0xFFFFFFFE
c = -3		0xFDFDFDFD		0xFFFFFFFD
...
c = -2147483648	0x00000000		0x80000000

> +		}

I suggest to omit the special case for zero and handle it just the
same. This results in smaller code size and is easier to read.

> +		while (count--)
> +			*s32++ = c32;
> +		return s;
> +	}
> +	/* else, fill 8 bits at a time */

Blank line here, please.

>  	while (count--)
>  		*xs++ = c;

Please fix and resubmit.

Best regards,

Wolfgang Denk

-- 
DENX Software Engineering GmbH,     MD: Wolfgang Denk & Detlev Zundel
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: (+49)-8142-66989-10 Fax: (+49)-8142-66989-80 Email: wd at denx.de
God made machine language; all the rest is the work of man.


More information about the U-Boot mailing list