bitops.h revision 7d82a4640abdcc3ffbd89c7971a11e4ac7953b7f
1e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#ifndef _PERF_LINUX_BITOPS_H_ 2e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#define _PERF_LINUX_BITOPS_H_ 3e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 4e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng/* ANDROID_CHANGE_BEGIN */ 5e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#if 0 6e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#include <linux/kernel.h> 7e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#include <linux/compiler.h> 8e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#include <asm/hweight.h> 9e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#else 10e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#include "kernel.h" 11e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#include "compiler.h" 12e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#include "../asm/hweight.h" 137d82a4640abdcc3ffbd89c7971a11e4ac7953b7fBen Cheng#if defined(__BIONIC__) || defined(__APPLE__) 14e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#define __WORDSIZE 32 15e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#endif 16e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#endif 17e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng/* ANDROID_CHANGE_END */ 18e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 19e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#define BITS_PER_LONG __WORDSIZE 20e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#define BITS_PER_BYTE 8 21e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#define BITS_TO_LONGS(nr) DIV_ROUND_UP(nr, BITS_PER_BYTE * sizeof(long)) 22e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 23e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengstatic inline void set_bit(int nr, unsigned long *addr) 24e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng{ 25e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng addr[nr / BITS_PER_LONG] |= 1UL << (nr % BITS_PER_LONG); 26e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng} 27e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 28e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengstatic inline void clear_bit(int nr, unsigned long *addr) 29e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng{ 30e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng addr[nr / BITS_PER_LONG] &= ~(1UL << (nr % BITS_PER_LONG)); 31e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng} 32e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 33e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengstatic __always_inline int test_bit(unsigned int nr, const unsigned long *addr) 34e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng{ 35e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng return ((1UL << (nr % BITS_PER_LONG)) & 36e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng (((unsigned long *)addr)[nr / BITS_PER_LONG])) != 0; 37e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng} 38e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 39e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengstatic inline unsigned long hweight_long(unsigned long w) 40e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng{ 41e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng return sizeof(w) == 4 ? hweight32(w) : hweight64(w); 42e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng} 43e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 44e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#endif 45