Date: Sat, 9 Jul 2011 20:04:32 +0300 From: Kostik Belousov <kostikbel@gmail.com> To: Ed Schouten <ed@80386.nl> Cc: svn-src-head@FreeBSD.org, svn-src-all@FreeBSD.org, src-committers@FreeBSD.org Subject: Re: svn commit: r223884 - head/sys/sys Message-ID: <20110709170432.GL48734@deviant.kiev.zoral.com.ua> In-Reply-To: <20110709153628.GJ16219@hoeg.nl> References: <201107091429.p69ETNNu003910@svn.freebsd.org> <20110709153628.GJ16219@hoeg.nl>
next in thread | previous in thread | raw e-mail | index | archive | help
--eULE+JHRRz2mSqwH Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Content-Transfer-Encoding: quoted-printable On Sat, Jul 09, 2011 at 05:36:28PM +0200, Ed Schouten wrote: > Hi Kostik, >=20 > * Konstantin Belousov <kib@FreeBSD.org>, 20110709 16:29: > > +static __inline uint16_t > > +bitcount16(uint32_t x) >=20 > Shouldn't we use uint16_t for the argument here? Not sure. uint32_t type of argument avoids repromotion, allowing to do the full-register calculation on both 32 and 64 bit architectures. The function correctly handles non-zero upper half-word on its own. >=20 > When I saw the code, I thought by myself, this could be done more > efficiently: >=20 > | static __inline uint16_t > | bitcount16(uint16_t x) > | { > | > | x =3D (x & 0x5555) + ((x >> 1) & 0x5555); > | x =3D (x & 0x3333) + ((x >> 2) & 0x3333); > | x *=3D 0x1111; > | return (x >> 12); > | } >=20 > But some testing revealed it works for all inputs, except 65536. d'oh! >=20 > --=20 > Ed Schouten <ed@80386.nl> > WWW: http://80386.nl/ --eULE+JHRRz2mSqwH Content-Type: application/pgp-signature Content-Disposition: inline -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.11 (FreeBSD) iEYEARECAAYFAk4YiiAACgkQC3+MBN1Mb4hBxQCgtf1CQybdUzbopmNuPw8ysusr tEgAoK3a/E/FBBoO/16ZZyV2p6ew7w6v =uHxi -----END PGP SIGNATURE----- --eULE+JHRRz2mSqwH--
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20110709170432.GL48734>