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 21 #ifndef _LINUX_BITOPS_H 22 #error only <linux/bitops.h> can be included directly 23 #endif 24 25 #ifdef __tilegx__ 26 #include <asm/bitops_64.h> 27 #else 28 #include <asm/bitops_32.h> 29 #endif 30 31 /** 32 * __ffs - find first set bit in word 33 * @word: The word to search 34 * 35 * Undefined if no set bit exists, so code should check against 0 first. 36 */ __ffs(unsigned long word)37static inline unsigned long __ffs(unsigned long word) 38 { 39 return __builtin_ctzl(word); 40 } 41 42 /** 43 * ffz - find first zero bit in word 44 * @word: The word to search 45 * 46 * Undefined if no zero exists, so code should check against ~0UL first. 47 */ ffz(unsigned long word)48static inline unsigned long ffz(unsigned long word) 49 { 50 return __builtin_ctzl(~word); 51 } 52 53 /** 54 * __fls - find last set bit in word 55 * @word: The word to search 56 * 57 * Undefined if no set bit exists, so code should check against 0 first. 58 */ __fls(unsigned long word)59static inline unsigned long __fls(unsigned long word) 60 { 61 return (sizeof(word) * 8) - 1 - __builtin_clzl(word); 62 } 63 64 /** 65 * ffs - find first set bit in word 66 * @x: the word to search 67 * 68 * This is defined the same way as the libc and compiler builtin ffs 69 * routines, therefore differs in spirit from the other bitops. 70 * 71 * ffs(value) returns 0 if value is 0 or the position of the first 72 * set bit if value is nonzero. The first (least significant) bit 73 * is at position 1. 74 */ ffs(int x)75static inline int ffs(int x) 76 { 77 return __builtin_ffs(x); 78 } 79 80 /** 81 * fls - find last set bit in word 82 * @x: the word to search 83 * 84 * This is defined in a similar way as the libc and compiler builtin 85 * ffs, but returns the position of the most significant set bit. 86 * 87 * fls(value) returns 0 if value is 0 or the position of the last 88 * set bit if value is nonzero. The last (most significant) bit is 89 * at position 32. 90 */ fls(int x)91static inline int fls(int x) 92 { 93 return (sizeof(int) * 8) - __builtin_clz(x); 94 } 95 fls64(__u64 w)96static inline int fls64(__u64 w) 97 { 98 return (sizeof(__u64) * 8) - __builtin_clzll(w); 99 } 100 __arch_hweight32(unsigned int w)101static inline unsigned int __arch_hweight32(unsigned int w) 102 { 103 return __builtin_popcount(w); 104 } 105 __arch_hweight16(unsigned int w)106static inline unsigned int __arch_hweight16(unsigned int w) 107 { 108 return __builtin_popcount(w & 0xffff); 109 } 110 __arch_hweight8(unsigned int w)111static inline unsigned int __arch_hweight8(unsigned int w) 112 { 113 return __builtin_popcount(w & 0xff); 114 } 115 __arch_hweight64(__u64 w)116static inline unsigned long __arch_hweight64(__u64 w) 117 { 118 return __builtin_popcountll(w); 119 } 120 121 #include <asm-generic/bitops/const_hweight.h> 122 #include <asm-generic/bitops/lock.h> 123 #include <asm-generic/bitops/find.h> 124 #include <asm-generic/bitops/sched.h> 125 #include <asm-generic/bitops/non-atomic.h> 126 #include <asm-generic/bitops/le.h> 127 128 #endif /* _ASM_TILE_BITOPS_H */ 129