]> CyberLeo.Net >> Repos - FreeBSD/stable/10.git/commit
MFC 278474,278476,280279:
authorjhb <jhb@ccf9f872-aa2e-dd11-9fc8-001c23d0bc1f>
Tue, 14 Apr 2015 20:05:26 +0000 (20:05 +0000)
committerjhb <jhb@ccf9f872-aa2e-dd11-9fc8-001c23d0bc1f>
Tue, 14 Apr 2015 20:05:26 +0000 (20:05 +0000)
commit3733294031f0073234443666604099df2c06e63a
tree972b20fdf5104b2f360f75937fb17893c3d1afc8
parentb053f4c1915d14eebfa99a1e98bd6d028ddd69bd
MFC 278474,278476,280279:
Expand the bitcount*() API and use it to implement CPU_COUNT for cpusets.

278474:
Use __builtin_popcnt() to implement a BIT_COUNT() operation for bitsets and
use this to implement CPU_COUNT() to count the number of CPUs in a cpuset.

278476:
Use __builtin_popcountl() instead of __builtin_popcount().

280279:
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.
- Use the existing bitcount16() and bitcount32() from <sys/systm.h> to
  implement the non-POPCNT __bitcount16() and __bitcount32() in
  <sys/types.h>.
- For the non-POPCNT __bitcount64(), use a similar SWAR method on 64-bit
  systems.  For 32-bit systems, use two __bitcount32() operations on the
  two halves.
- Use __bitcount32() to provide a __bitcount() that operates on plain ints.
- Use either __bitcount32() or __bitcount64() to provide a
  __bitcountl() that operates on longs.
- Add public bitcount*() wrappers for __bitcount*() for use in the kernel
  in <sys/libkern.h>.
- Use __bitcountl() instead of __builtin_popcountl() in BIT_COUNT().

git-svn-id: svn://svn.freebsd.org/base/stable/10@281538 ccf9f872-aa2e-dd11-9fc8-001c23d0bc1f
sys/sys/bitset.h
sys/sys/cpuset.h
sys/sys/libkern.h
sys/sys/systm.h
sys/sys/types.h