1c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#ifndef _LINUX_BITOPS_H 2c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define _LINUX_BITOPS_H 3c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#include <asm/types.h> 4c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 5c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* 6c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Include this here because some architectures need generic_ffs/fls in 7c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * scope 8c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 9c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#include <asm/bitops.h> 10c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 11c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic __inline__ int get_bitmask_order(unsigned int count) 12c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{ 13c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru int order; 14c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 15c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru order = fls(count); 16c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru return order; /* We could be slightly more clever with -1 here... */ 17c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} 18c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 19c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic __inline__ int get_count_order(unsigned int count) 20c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{ 21c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru int order; 22c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 23c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru order = fls(count) - 1; 24c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru if (count & (count - 1)) 25c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru order++; 26c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru return order; 27c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} 28c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 29c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline unsigned long hweight_long(unsigned long w) 30c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{ 31c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru return sizeof(w) == 4 ? hweight32(w) : hweight64(w); 32c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} 33c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 34c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* 35c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * rol32 - rotate a 32-bit value left 36c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * 37c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @word: value to rotate 38c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @shift: bits to roll 39c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 40c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline __u32 rol32(__u32 word, unsigned int shift) 41c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{ 42c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru return (word << shift) | (word >> (32 - shift)); 43c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} 44c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 45c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* 46c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * ror32 - rotate a 32-bit value right 47c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * 48c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @word: value to rotate 49c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @shift: bits to roll 50c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 51c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline __u32 ror32(__u32 word, unsigned int shift) 52c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{ 53c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru return (word >> shift) | (word << (32 - shift)); 54c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} 55c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 56c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline unsigned fls_long(unsigned long l) 57c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{ 58c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru if (sizeof(l) == 4) 59c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru return fls(l); 60c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru return fls64(l); 61c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} 62c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 63c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#endif 64