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 */ 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 */ 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 */ 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 */ 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 */ 91static inline int fls(int x) 92{ 93 return (sizeof(int) * 8) - __builtin_clz(x); 94} 95 96static inline int fls64(__u64 w) 97{ 98 return (sizeof(__u64) * 8) - __builtin_clzll(w); 99} 100 101static inline unsigned int __arch_hweight32(unsigned int w) 102{ 103 return __builtin_popcount(w); 104} 105 106static inline unsigned int __arch_hweight16(unsigned int w) 107{ 108 return __builtin_popcount(w & 0xffff); 109} 110 111static inline unsigned int __arch_hweight8(unsigned int w) 112{ 113 return __builtin_popcount(w & 0xff); 114} 115 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/ext2-non-atomic.h> 126#include <asm-generic/bitops/minix.h> 127 128#endif /* _ASM_TILE_BITOPS_H */ 129