Date: Wed, 7 Feb 2007 02:59:16 -0800 From: Luigi Rizzo <rizzo@icir.org> To: Attilio Rao <attilio@freebsd.org> Cc: Stefan Bethke <stb@lassitu.de>, current@freebsd.org Subject: Re: C macro to find the next power of 2 ? Message-ID: <20070207025916.A63989@xorpc.icir.org> In-Reply-To: <3bbf2fe10702070255q58ab6c9fn2b393cfbc75a3fb@mail.gmail.com>; from attilio@freebsd.org on Wed, Feb 07, 2007 at 11:55:27AM %2B0100 References: <20070207004131.A62183@xorpc.icir.org> <15241.SV0BLFJbGwk=.1170843949.squirrel@koef.zs64.net> <20070207024918.D63529@xorpc.icir.org> <3bbf2fe10702070255q58ab6c9fn2b393cfbc75a3fb@mail.gmail.com>
next in thread | previous in thread | raw e-mail | index | archive | help
On Wed, Feb 07, 2007 at 11:55:27AM +0100, Attilio Rao wrote:
> 2007/2/7, Luigi Rizzo <rizzo@icir.org>:
> > On Wed, Feb 07, 2007 at 11:25:49AM +0100, Stefan Bethke wrote:
> > > On Wed, February 7, 2007 09:41, Luigi Rizzo wrote:
> > > > My problem is that some hardware wants data structures aligned to
> > > > the next power of 2 with respect to their size, and the code
> > > > in question (the ehci driver in case you care) has hardwired
> > > > constants for this, and possibly wrong ones.
> > > >
> > > > It would be nice if one could write
> > > >
> > > > struct foo_desc {
> > > > ...
> > > > };
> > > >
> > > > #define FOO_ALIGN next_power_of_2(sizeof(struct foo_desc))
> > > >
> > > > instead of having to count fields and make guesses on the size
> > > > of pointers and so on.
> > >
> > > _Hacker's Delight_ contains many cool tricks, including multiple solutions
> > > for this, IIRC. I'll have a look tonight when I'm back home.
> >
> > funny it looks like the same code that i posted,
> > except that mine is functional and theirs procedural:
> >
> > my version:
> >
> > #define b2(x) ( (x) | ( (x) >> 1) )
> > #define b4(x) ( b2(x) | ( b2(x) >> 2) )
> > #define b8(x) ( b4(x) | ( b4(x) >> 4) )
> > #define b16(x) ( b8(x) | ( b8(x) >> 8) )
> > #define b32(x) (b16(x) | (b16(x) >>16) )
> > #define next_power_of_2(x) (b32(x-1) + 1)
> >
> > Hacker's Delight version
> >
> > unsigned clp2(unsigned x) {
> > x = x - 1;
> > x = x | (x >> 1);
> > x = x | (x >> 2);
> > x = x | (x >> 4);
> > x = x | (x >> 8);
> > x = x | (x >>16);
> > return x + 1;
> > }
>
> You cannot use this unless you don't rewrite as a preprocessing stub.
that's why i am using my version and wrote it functionally.
luigi
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20070207025916.A63989>
