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