Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
awilliam
GitHub Repository: awilliam/linux-vfio
Path: blob/master/arch/tile/include/asm/bitops.h
10819 views
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
*/
37
static 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
*/
48
static 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
*/
59
static 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
*/
75
static 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
*/
91
static inline int fls(int x)
92
{
93
return (sizeof(int) * 8) - __builtin_clz(x);
94
}
95
96
static inline int fls64(__u64 w)
97
{
98
return (sizeof(__u64) * 8) - __builtin_clzll(w);
99
}
100
101
static inline unsigned int __arch_hweight32(unsigned int w)
102
{
103
return __builtin_popcount(w);
104
}
105
106
static inline unsigned int __arch_hweight16(unsigned int w)
107
{
108
return __builtin_popcount(w & 0xffff);
109
}
110
111
static inline unsigned int __arch_hweight8(unsigned int w)
112
{
113
return __builtin_popcount(w & 0xff);
114
}
115
116
static 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
130