2
* Copyright 1992, Linus Torvalds.
3
* Copyright 2010 Tilera Corporation. All Rights Reserved.
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.
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
16
#ifndef _ASM_TILE_BITOPS_H
17
#define _ASM_TILE_BITOPS_H
19
#include <linux/types.h>
21
#ifndef _LINUX_BITOPS_H
22
#error only <linux/bitops.h> can be included directly
26
#include <asm/bitops_64.h>
28
#include <asm/bitops_32.h>
32
* __ffs - find first set bit in word
33
* @word: The word to search
35
* Undefined if no set bit exists, so code should check against 0 first.
37
static inline unsigned long __ffs(unsigned long word)
39
return __builtin_ctzl(word);
43
* ffz - find first zero bit in word
44
* @word: The word to search
46
* Undefined if no zero exists, so code should check against ~0UL first.
48
static inline unsigned long ffz(unsigned long word)
50
return __builtin_ctzl(~word);
54
* __fls - find last set bit in word
55
* @word: The word to search
57
* Undefined if no set bit exists, so code should check against 0 first.
59
static inline unsigned long __fls(unsigned long word)
61
return (sizeof(word) * 8) - 1 - __builtin_clzl(word);
65
* ffs - find first set bit in word
66
* @x: the word to search
68
* This is defined the same way as the libc and compiler builtin ffs
69
* routines, therefore differs in spirit from the other bitops.
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
75
static inline int ffs(int x)
77
return __builtin_ffs(x);
81
* fls - find last set bit in word
82
* @x: the word to search
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.
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
91
static inline int fls(int x)
93
return (sizeof(int) * 8) - __builtin_clz(x);
96
static inline int fls64(__u64 w)
98
return (sizeof(__u64) * 8) - __builtin_clzll(w);
101
static inline unsigned int __arch_hweight32(unsigned int w)
103
return __builtin_popcount(w);
106
static inline unsigned int __arch_hweight16(unsigned int w)
108
return __builtin_popcount(w & 0xffff);
111
static inline unsigned int __arch_hweight8(unsigned int w)
113
return __builtin_popcount(w & 0xff);
116
static inline unsigned long __arch_hweight64(__u64 w)
118
return __builtin_popcountll(w);
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>
128
#endif /* _ASM_TILE_BITOPS_H */