All of lore.kernel.org
 help / color / mirror / Atom feed
From: Heiko Stuebner <heiko@sntech.de>
To: u-boot@lists.denx.de
Subject: [U-Boot] [PATCH 2/3] string: Provide a slimmed-down memset()
Date: Mon, 27 Mar 2017 17:17:08 +0200	[thread overview]
Message-ID: <2820179.4CMHj66v3A@phil> (raw)
In-Reply-To: <2c3809e6-20f1-bbd3-9775-7ef5015d6193@suse.de>

Am Montag, 27. März 2017, 09:14:47 CEST schrieb Alexander Graf:
> 
> On 27/03/2017 01:38, Simon Glass wrote:
> > Most of the time the optimised memset() is what we want. For extreme
> > situations such as TPL it may be too large. For example on the 'rock'
> > board, using a simple loop saves a useful 48 bytes. With gcc 4.9 and
> > the rodata bug, this patch is enough to reduce the TPL image below the
> > limit.
> >
> > Signed-off-by: Simon Glass <sjg@chromium.org>
> > ---
> >
> >  lib/Kconfig  | 9 +++++++++
> >  lib/string.c | 6 ++++--
> >  2 files changed, 13 insertions(+), 2 deletions(-)
> >
> > diff --git a/lib/Kconfig b/lib/Kconfig
> > index 65c01573e1..5bf512d8c0 100644
> > --- a/lib/Kconfig
> > +++ b/lib/Kconfig
> > @@ -52,6 +52,15 @@ config LIB_RAND
> >  	help
> >  	  This library provides pseudo-random number generator functions.
> >
> > +config FAST_MEMSET
> > +	bool "Use an optimised memset()"
> > +	default y
> > +	help
> > +	  The faster memset() is the arch-specific one (if available) enabled
> > +	  by CONFIG_USE_ARCH_MEMSET. If that is not enabled, we can still get
> > +	  better performance by write a word at a time. Disable this option
> > +	  to reduce code size slightly at the cost of some speed.
> 
> The comment sounds slightly confused - it took me a few times of reading 
> it until I grasped what it was trying to tell me :).
> 
> > +
> >  source lib/dhry/Kconfig
> >
> >  source lib/rsa/Kconfig
> > diff --git a/lib/string.c b/lib/string.c
> > index 67d5f6a421..159493ed17 100644
> > --- a/lib/string.c
> > +++ b/lib/string.c
> > @@ -437,8 +437,10 @@ char *strswab(const char *s)
> >  void * memset(void * s,int c,size_t count)
> >  {
> >  	unsigned long *sl = (unsigned long *) s;
> > -	unsigned long cl = 0;
> >  	char *s8;
> > +
> > +#ifdef CONFIG_FAST_MEMSET
> > +	unsigned long cl = 0;
> >  	int i;
> >
> >  	/* do it one word at a time (32 bits or 64 bits) while possible */
> > @@ -452,7 +454,7 @@ void * memset(void * s,int c,size_t count)
> >  			count -= sizeof(*sl);
> >  		}
> >  	}
> > -	/* fill 8 bits at a time */
> > +#endif	/* fill 8 bits at a time */
> 
> So while this is all neat, a few ideas:
> 
> 1) Would having memset in a header improve things even more? After all, 
> each external function call clobbers registers that you need to 
> save/restore...

I'd guess it really depends on the size constraints. The regular
libgeneric memset compiles on my rk3188 tpl to a total of
64bytes on both gcc-4.9 and gcc-6.3 while Simon's fast-memset
comes down to 14bytes on my rk3188.

On the rk3188 the only memset user is board_init_f, so here memset
is called only once without needing to save registers and I'd guess if an
implementation really is that size-constrained to worry about 50bytes
this one caller will probably always be the only one?


> 2) How much would GOLD save you? Have you tried? U-Boot is small enough 
> of a code base that global optimizations should be able to give 
> significant size savings.

I think the issue that this is trying to solve is to allow more
toolchains to be used and thus make rebuilds on changes work on a lot
of boards at the same time with random toolchains.

gcc-6.3 already produces way smaller results (well within the size
constraints the rk3188 has) than for example the gcc-4.9 used by
buildman as baseline toolchain.

  reply	other threads:[~2017-03-27 15:17 UTC|newest]

Thread overview: 12+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-03-26 23:38 [U-Boot] [PATCH 0/3] RFC: Patches to reduce TPL code size Simon Glass
2017-03-26 23:38 ` [U-Boot] [PATCH 1/3] Makefile: Correct dependency race condition with TPL Simon Glass
2017-03-27 19:39   ` Heiko Stuebner
2017-04-02  0:05     ` Simon Glass
2017-03-26 23:38 ` [U-Boot] [PATCH 2/3] string: Provide a slimmed-down memset() Simon Glass
2017-03-27  7:14   ` Alexander Graf
2017-03-27 15:17     ` Heiko Stuebner [this message]
2017-03-27 21:16       ` Alexander Graf
2017-03-28 12:34         ` Heiko Stuebner
2017-03-27 19:55   ` Heiko Stuebner
2017-03-30 11:14   ` [U-Boot] [PATCH v2] " Heiko Stuebner
2017-03-26 23:38 ` [U-Boot] [PATCH 3/3] Makefile: Provide an option to select SPL or TPL Simon Glass

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=2820179.4CMHj66v3A@phil \
    --to=heiko@sntech.de \
    --cc=u-boot@lists.denx.de \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.