[U-Boot] [PATCH V4 2/3] lib_generic memset: fill one word at a time if possible
Joakim Tjernlund
joakim.tjernlund at transmode.se
Sat Oct 10 12:43:41 CEST 2009
u-boot-bounces at lists.denx.de wrote on 10/10/2009 11:51:16:
> From:
>
> Alessandro Rubini <rubini-list at gnudd.com>
>
> To:
>
> u-boot at lists.denx.de
>
> Cc:
>
> STEricsson_nomadik_linux at list.st.com, andrea.gallo at stericsson.com
>
> Date:
>
> 10/10/2009 11:51
>
> Subject:
>
> [U-Boot] [PATCH V4 2/3] lib_generic memset: fill one word at a time if possible
>
> Sent by:
>
> u-boot-bounces at lists.denx.de
>
> From: Alessandro Rubini <rubini at unipv.it>
>
> If the destination is aligned, fill ulong values until possible.
> Then fill remaining part by byte.
>
> Signed-off-by: Alessandro Rubini <rubini at unipv.it>
> Acked-by: Andrea Gallo <andrea.gallo at stericsson.com>
> Acked-by: Mike Frysinger <vapier at gentoo.org>
> ---
> lib_generic/string.c | 22 +++++++++++++++++++---
> 1 files changed, 19 insertions(+), 3 deletions(-)
>
> diff --git a/lib_generic/string.c b/lib_generic/string.c
> index 61a45dc..b375b81 100644
> --- a/lib_generic/string.c
> +++ b/lib_generic/string.c
> @@ -403,10 +403,26 @@ char *strswab(const char *s)
> */
> void * memset(void * s,int c,size_t count)
> {
> - char *xs = (char *) s;
> -
> + unsigned long *sl = (unsigned long *) s;
> + unsigned long cl = 0;
> + char *s8;
> + int i;
> +
> + /* do it one word at a time (32 bits or 64 bits) while possible */
> + if ( ((ulong)s & (sizeof(*sl) - 1)) == 0) {
> + for (i = 0; i < sizeof(*sl); i++) {
> + cl <<= 8;
> + cl |= c & 0xff;
> + }
> + while (count >= sizeof(*sl)) {
> + *sl++ = cl;
> + count -= sizeof(*sl);
> + }
The above while can be slow if not the complier manages to turn into:
for(wc = count / sizeof(*sl); wc; --wc) {
*sl++ = cl;
}
count = count & (sizeof(*sl)-1);
even better would be:
for(--sl, wc = count / sizeof(*sl); wc; --wc) {
*++sl = cl;
}
++sl;
count = count & (sizeof(*sl)-1);
for those arch's that can do pre inc and load/store in one
instruction.
Just figured I should mention it.
More information about the U-Boot
mailing list