| 
									
										
										
										
											2010-04-30 19:31:12 -03:00
										 |  |  | #ifndef _PERF_BITOPS_H
 | 
					
						
							|  |  |  | #define _PERF_BITOPS_H
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include <string.h>
 | 
					
						
							|  |  |  | #include <linux/bitops.h>
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | int __bitmap_weight(const unsigned long *bitmap, int bits); | 
					
						
							| 
									
										
										
										
											2012-01-27 15:34:23 +01:00
										 |  |  | void __bitmap_or(unsigned long *dst, const unsigned long *bitmap1, | 
					
						
							|  |  |  | 		 const unsigned long *bitmap2, int bits); | 
					
						
							| 
									
										
										
										
											2010-04-30 19:31:12 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  | #define BITMAP_LAST_WORD_MASK(nbits)					\
 | 
					
						
							|  |  |  | (									\ | 
					
						
							|  |  |  | 	((nbits) % BITS_PER_LONG) ?					\ | 
					
						
							|  |  |  | 		(1UL<<((nbits) % BITS_PER_LONG))-1 : ~0UL		\ | 
					
						
							|  |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #define small_const_nbits(nbits) \
 | 
					
						
							|  |  |  | 	(__builtin_constant_p(nbits) && (nbits) <= BITS_PER_LONG) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static inline void bitmap_zero(unsigned long *dst, int nbits) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	if (small_const_nbits(nbits)) | 
					
						
							|  |  |  | 		*dst = 0UL; | 
					
						
							|  |  |  | 	else { | 
					
						
							|  |  |  | 		int len = BITS_TO_LONGS(nbits) * sizeof(unsigned long); | 
					
						
							|  |  |  | 		memset(dst, 0, len); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static inline int bitmap_weight(const unsigned long *src, int nbits) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	if (small_const_nbits(nbits)) | 
					
						
							|  |  |  | 		return hweight_long(*src & BITMAP_LAST_WORD_MASK(nbits)); | 
					
						
							|  |  |  | 	return __bitmap_weight(src, nbits); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-01-27 15:34:23 +01:00
										 |  |  | static inline void bitmap_or(unsigned long *dst, const unsigned long *src1, | 
					
						
							|  |  |  | 			     const unsigned long *src2, int nbits) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	if (small_const_nbits(nbits)) | 
					
						
							|  |  |  | 		*dst = *src1 | *src2; | 
					
						
							|  |  |  | 	else | 
					
						
							|  |  |  | 		__bitmap_or(dst, src1, src2, nbits); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-04-30 19:31:12 -03:00
										 |  |  | #endif /* _PERF_BITOPS_H */
 |