svn commit: r280279 - head/sys/sys

Bruce Evans brde at optusnet.com.au
Fri Mar 20 22:43:15 UTC 2015


On Fri, 20 Mar 2015, Konstantin Belousov wrote:

> On Fri, Mar 20, 2015 at 10:27:06AM +0000, John Baldwin wrote:
>> Author: jhb
>> Date: Fri Mar 20 10:27:06 2015
>> New Revision: 280279
>> URL: https://svnweb.freebsd.org/changeset/base/280279
>>
>> Log:
>>   Expand the bitcount* API to support 64-bit integers, plain ints and longs
>>   and create a "hidden" API that can be used in other system headers without
>>   adding namespace pollution.
>>   - If the POPCNT instruction is enabled at compile time, use
>>     __builtin_popcount*() to implement __bitcount*(), otherwise fall back
>>     to software implementations.

> Are you aware of the Haswell errata HSD146 ?  I see the described behaviour

I wasn't.

> on machines back to SandyBridge, but not on Nehalems.
> HSD146.   POPCNT Instruction May Take Longer to Execute Than Expected
> Problem: POPCNT instruction execution with a 32 or 64 bit operand may be
> delayed until previous non-dependent instructions have executed.

If it only affects performance, then it is up to the compiler to fix it.

> Jilles noted that gcc head and 4.9.2 already provides a workaround by
> xoring the dst register.  I have some patch for amd64 pmap, see the end
> of the message.

IIRC, then patch never never uses asm, but intentionally uses the popcount
builtin to avoid complications.

>>   - Use the existing bitcount16() and bitcount32() from <sys/systm.h> to
>>     implement the non-POPCNT __bitcount16() and __bitcount32() in
>>     <sys/types.h>.
> Why is it in sys/types.h ?

To make it easier to use, while minimizing namespace pollution and
inefficiencies.  Like the functions used to implement ntohl(), except
the implementation is MI so it doesn't need to be in <machine>.
(The functions used to implement ntohl() are in machine/endian.h.
sys/types.h always includes that, so it makes little difference to
pollution and inefficiency that the implementation is not more directly
in machine/_types.h.)  bitcount is simpler and not burdened by
compatibility, so it doesn't need a separate header.)

Bruce


More information about the svn-src-head mailing list