1e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#ifndef _PERF_BITOPS_H
2e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#define _PERF_BITOPS_H
3e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
4e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include <string.h>
5e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include <linux/bitops.h>
6e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
7e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengint __bitmap_weight(const unsigned long *bitmap, int bits);
8e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengvoid __bitmap_or(unsigned long *dst, const unsigned long *bitmap1,
9e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		 const unsigned long *bitmap2, int bits);
10e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
11e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#define BITMAP_LAST_WORD_MASK(nbits)					\
12e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng(									\
13e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	((nbits) % BITS_PER_LONG) ?					\
14e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		(1UL<<((nbits) % BITS_PER_LONG))-1 : ~0UL		\
15e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng)
16e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
17e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#define small_const_nbits(nbits) \
18e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	(__builtin_constant_p(nbits) && (nbits) <= BITS_PER_LONG)
19e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
20e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstatic inline void bitmap_zero(unsigned long *dst, int nbits)
21e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng{
22e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	if (small_const_nbits(nbits))
23e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		*dst = 0UL;
24e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	else {
25e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		int len = BITS_TO_LONGS(nbits) * sizeof(unsigned long);
26e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		memset(dst, 0, len);
27e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	}
28e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng}
29e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
30e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstatic inline int bitmap_weight(const unsigned long *src, int nbits)
31e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng{
32e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	if (small_const_nbits(nbits))
33e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		return hweight_long(*src & BITMAP_LAST_WORD_MASK(nbits));
34e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	return __bitmap_weight(src, nbits);
35e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng}
36e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
37e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstatic inline void bitmap_or(unsigned long *dst, const unsigned long *src1,
38e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng			     const unsigned long *src2, int nbits)
39e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng{
40e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	if (small_const_nbits(nbits))
41e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		*dst = *src1 | *src2;
42e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	else
43e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		__bitmap_or(dst, src1, src2, nbits);
44e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng}
45e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
46e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#endif /* _PERF_BITOPS_H */
47