1 /* 2 * Copyright 1992, Linus Torvalds. 3 * Copyright 2010 Tilera Corporation. All Rights Reserved. 4 * 5 * This program is free software; you can redistribute it and/or 6 * modify it under the terms of the GNU General Public License 7 * as published by the Free Software Foundation, version 2. 8 * 9 * This program is distributed in the hope that it will be useful, but 10 * WITHOUT ANY WARRANTY; without even the implied warranty of 11 * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or 12 * NON INFRINGEMENT. See the GNU General Public License for 13 * more details. 14 */ 15 16 #ifndef _ASM_TILE_BITOPS_H 17 #define _ASM_TILE_BITOPS_H 18 19 #include <linux/types.h> 20 #include <asm/barrier.h> 21 22 #ifndef _LINUX_BITOPS_H 23 #error only <linux/bitops.h> can be included directly 24 #endif 25 26 #ifdef __tilegx__ 27 #include <asm/bitops_64.h> 28 #else 29 #include <asm/bitops_32.h> 30 #endif 31 32 /** 33 * ffz - find first zero bit in word 34 * @word: The word to search 35 * 36 * Undefined if no zero exists, so code should check against ~0UL first. 37 */ ffz(unsigned long word)38static inline unsigned long ffz(unsigned long word) 39 { 40 return __builtin_ctzl(~word); 41 } 42 fls64(__u64 w)43static inline int fls64(__u64 w) 44 { 45 return (sizeof(__u64) * 8) - __builtin_clzll(w); 46 } 47 48 /** 49 * fls - find last set bit in word 50 * @x: the word to search 51 * 52 * This is defined in a similar way as the libc and compiler builtin 53 * ffs, but returns the position of the most significant set bit. 54 * 55 * fls(value) returns 0 if value is 0 or the position of the last 56 * set bit if value is nonzero. The last (most significant) bit is 57 * at position 32. 58 */ fls(int x)59static inline int fls(int x) 60 { 61 return fls64((unsigned int) x); 62 } 63 __arch_hweight32(unsigned int w)64static inline unsigned int __arch_hweight32(unsigned int w) 65 { 66 return __builtin_popcount(w); 67 } 68 __arch_hweight16(unsigned int w)69static inline unsigned int __arch_hweight16(unsigned int w) 70 { 71 return __builtin_popcount(w & 0xffff); 72 } 73 __arch_hweight8(unsigned int w)74static inline unsigned int __arch_hweight8(unsigned int w) 75 { 76 return __builtin_popcount(w & 0xff); 77 } 78 __arch_hweight64(__u64 w)79static inline unsigned long __arch_hweight64(__u64 w) 80 { 81 return __builtin_popcountll(w); 82 } 83 84 #include <asm-generic/bitops/builtin-__ffs.h> 85 #include <asm-generic/bitops/builtin-__fls.h> 86 #include <asm-generic/bitops/builtin-ffs.h> 87 #include <asm-generic/bitops/const_hweight.h> 88 #include <asm-generic/bitops/lock.h> 89 #include <asm-generic/bitops/find.h> 90 #include <asm-generic/bitops/sched.h> 91 #include <asm-generic/bitops/non-atomic.h> 92 #include <asm-generic/bitops/le.h> 93 94 #endif /* _ASM_TILE_BITOPS_H */ 95