]> err.no Git - linux-2.6/blob - include/asm-generic/bitops.h
Merge branch 'upstream' of master.kernel.org:/pub/scm/linux/kernel/git/jgarzik/libata-dev
[linux-2.6] / include / asm-generic / bitops.h
1 #ifndef _ASM_GENERIC_BITOPS_H_
2 #define _ASM_GENERIC_BITOPS_H_
3
4 /*
5  * For the benefit of those who are trying to port Linux to another
6  * architecture, here are some C-language equivalents.  You should
7  * recode these in the native assembly language, if at all possible.
8  * To guarantee atomicity, these routines call cli() and sti() to
9  * disable interrupts while they operate.  (You have to provide inline
10  * routines to cli() and sti().)
11  *
12  * Also note, these routines assume that you have 32 bit longs.
13  * You will have to change this if you are trying to port Linux to the
14  * Alpha architecture or to a Cray.  :-)
15  * 
16  * C language equivalents written by Theodore Ts'o, 9/26/92
17  */
18
19 extern __inline__ int set_bit(int nr,long * addr)
20 {
21         int     mask, retval;
22
23         addr += nr >> 5;
24         mask = 1 << (nr & 0x1f);
25         cli();
26         retval = (mask & *addr) != 0;
27         *addr |= mask;
28         sti();
29         return retval;
30 }
31
32 extern __inline__ int clear_bit(int nr, long * addr)
33 {
34         int     mask, retval;
35
36         addr += nr >> 5;
37         mask = 1 << (nr & 0x1f);
38         cli();
39         retval = (mask & *addr) != 0;
40         *addr &= ~mask;
41         sti();
42         return retval;
43 }
44
45 extern __inline__ int test_bit(int nr, const unsigned long * addr)
46 {
47         int     mask;
48
49         addr += nr >> 5;
50         mask = 1 << (nr & 0x1f);
51         return ((mask & *addr) != 0);
52 }
53
54 /*
55  * fls: find last bit set.
56  */
57
58 #define fls(x) generic_fls(x)
59 #define fls64(x)   generic_fls64(x)
60
61 #ifdef __KERNEL__
62
63 /*
64  * ffs: find first bit set. This is defined the same way as
65  * the libc and compiler builtin ffs routines, therefore
66  * differs in spirit from the above ffz (man ffs).
67  */
68
69 #define ffs(x) generic_ffs(x)
70
71 /*
72  * hweightN: returns the hamming weight (i.e. the number
73  * of bits set) of a N-bit word
74  */
75
76 #define hweight32(x) generic_hweight32(x)
77 #define hweight16(x) generic_hweight16(x)
78 #define hweight8(x) generic_hweight8(x)
79
80 #endif /* __KERNEL__ */
81
82 #endif /* _ASM_GENERIC_BITOPS_H */