diff options
Diffstat (limited to 'arch/sparc/include/asm/bitops_64.h')
-rw-r--r-- | arch/sparc/include/asm/bitops_64.h | 107 |
1 files changed, 107 insertions, 0 deletions
diff --git a/arch/sparc/include/asm/bitops_64.h b/arch/sparc/include/asm/bitops_64.h new file mode 100644 index 00000000000..bb87b808022 --- /dev/null +++ b/arch/sparc/include/asm/bitops_64.h | |||
@@ -0,0 +1,107 @@ | |||
1 | /* | ||
2 | * bitops.h: Bit string operations on the V9. | ||
3 | * | ||
4 | * Copyright 1996, 1997 David S. Miller (davem@caip.rutgers.edu) | ||
5 | */ | ||
6 | |||
7 | #ifndef _SPARC64_BITOPS_H | ||
8 | #define _SPARC64_BITOPS_H | ||
9 | |||
10 | #ifndef _LINUX_BITOPS_H | ||
11 | #error only <linux/bitops.h> can be included directly | ||
12 | #endif | ||
13 | |||
14 | #include <linux/compiler.h> | ||
15 | #include <asm/byteorder.h> | ||
16 | |||
17 | extern int test_and_set_bit(unsigned long nr, volatile unsigned long *addr); | ||
18 | extern int test_and_clear_bit(unsigned long nr, volatile unsigned long *addr); | ||
19 | extern int test_and_change_bit(unsigned long nr, volatile unsigned long *addr); | ||
20 | extern void set_bit(unsigned long nr, volatile unsigned long *addr); | ||
21 | extern void clear_bit(unsigned long nr, volatile unsigned long *addr); | ||
22 | extern void change_bit(unsigned long nr, volatile unsigned long *addr); | ||
23 | |||
24 | #include <asm-generic/bitops/non-atomic.h> | ||
25 | |||
26 | #ifdef CONFIG_SMP | ||
27 | #define smp_mb__before_clear_bit() membar_storeload_loadload() | ||
28 | #define smp_mb__after_clear_bit() membar_storeload_storestore() | ||
29 | #else | ||
30 | #define smp_mb__before_clear_bit() barrier() | ||
31 | #define smp_mb__after_clear_bit() barrier() | ||
32 | #endif | ||
33 | |||
34 | #include <asm-generic/bitops/ffz.h> | ||
35 | #include <asm-generic/bitops/__ffs.h> | ||
36 | #include <asm-generic/bitops/fls.h> | ||
37 | #include <asm-generic/bitops/__fls.h> | ||
38 | #include <asm-generic/bitops/fls64.h> | ||
39 | |||
40 | #ifdef __KERNEL__ | ||
41 | |||
42 | #include <asm-generic/bitops/sched.h> | ||
43 | #include <asm-generic/bitops/ffs.h> | ||
44 | |||
45 | /* | ||
46 | * hweightN: returns the hamming weight (i.e. the number | ||
47 | * of bits set) of a N-bit word | ||
48 | */ | ||
49 | |||
50 | #ifdef ULTRA_HAS_POPULATION_COUNT | ||
51 | |||
52 | static inline unsigned int hweight64(unsigned long w) | ||
53 | { | ||
54 | unsigned int res; | ||
55 | |||
56 | __asm__ ("popc %1,%0" : "=r" (res) : "r" (w)); | ||
57 | return res; | ||
58 | } | ||
59 | |||
60 | static inline unsigned int hweight32(unsigned int w) | ||
61 | { | ||
62 | unsigned int res; | ||
63 | |||
64 | __asm__ ("popc %1,%0" : "=r" (res) : "r" (w & 0xffffffff)); | ||
65 | return res; | ||
66 | } | ||
67 | |||
68 | static inline unsigned int hweight16(unsigned int w) | ||
69 | { | ||
70 | unsigned int res; | ||
71 | |||
72 | __asm__ ("popc %1,%0" : "=r" (res) : "r" (w & 0xffff)); | ||
73 | return res; | ||
74 | } | ||
75 | |||
76 | static inline unsigned int hweight8(unsigned int w) | ||
77 | { | ||
78 | unsigned int res; | ||
79 | |||
80 | __asm__ ("popc %1,%0" : "=r" (res) : "r" (w & 0xff)); | ||
81 | return res; | ||
82 | } | ||
83 | |||
84 | #else | ||
85 | |||
86 | #include <asm-generic/bitops/hweight.h> | ||
87 | |||
88 | #endif | ||
89 | #include <asm-generic/bitops/lock.h> | ||
90 | #endif /* __KERNEL__ */ | ||
91 | |||
92 | #include <asm-generic/bitops/find.h> | ||
93 | |||
94 | #ifdef __KERNEL__ | ||
95 | |||
96 | #include <asm-generic/bitops/ext2-non-atomic.h> | ||
97 | |||
98 | #define ext2_set_bit_atomic(lock,nr,addr) \ | ||
99 | test_and_set_bit((nr) ^ 0x38,(unsigned long *)(addr)) | ||
100 | #define ext2_clear_bit_atomic(lock,nr,addr) \ | ||
101 | test_and_clear_bit((nr) ^ 0x38,(unsigned long *)(addr)) | ||
102 | |||
103 | #include <asm-generic/bitops/minix.h> | ||
104 | |||
105 | #endif /* __KERNEL__ */ | ||
106 | |||
107 | #endif /* defined(_SPARC64_BITOPS_H) */ | ||