Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
bitops.h
Go to the documentation of this file.
1 #ifndef __ASM_SH_BITOPS_H
2 #define __ASM_SH_BITOPS_H
3 
4 #ifdef __KERNEL__
5 
6 #ifndef _LINUX_BITOPS_H
7 #error only <linux/bitops.h> can be included directly
8 #endif
9 
10 /* For __swab32 */
11 #include <asm/byteorder.h>
12 
13 #ifdef CONFIG_GUSA_RB
14 #include <asm/bitops-grb.h>
15 #elif defined(CONFIG_CPU_SH2A)
17 #include <asm/bitops-op32.h>
18 #elif defined(CONFIG_CPU_SH4A)
19 #include <asm/bitops-llsc.h>
20 #else
23 #endif
24 
25 /*
26  * clear_bit() doesn't provide any barrier for the compiler.
27  */
28 #define smp_mb__before_clear_bit() smp_mb()
29 #define smp_mb__after_clear_bit() smp_mb()
30 
31 #ifdef CONFIG_SUPERH32
32 static inline unsigned long ffz(unsigned long word)
33 {
34  unsigned long result;
35 
36  __asm__("1:\n\t"
37  "shlr %1\n\t"
38  "bt/s 1b\n\t"
39  " add #1, %0"
40  : "=r" (result), "=r" (word)
41  : "0" (~0L), "1" (word)
42  : "t");
43  return result;
44 }
45 
52 static inline unsigned long __ffs(unsigned long word)
53 {
54  unsigned long result;
55 
56  __asm__("1:\n\t"
57  "shlr %1\n\t"
58  "bf/s 1b\n\t"
59  " add #1, %0"
60  : "=r" (result), "=r" (word)
61  : "0" (~0L), "1" (word)
62  : "t");
63  return result;
64 }
65 #else
66 static inline unsigned long ffz(unsigned long word)
67 {
68  unsigned long result, __d2, __d3;
69 
70  __asm__("gettr tr0, %2\n\t"
71  "pta $+32, tr0\n\t"
72  "andi %1, 1, %3\n\t"
73  "beq %3, r63, tr0\n\t"
74  "pta $+4, tr0\n"
75  "0:\n\t"
76  "shlri.l %1, 1, %1\n\t"
77  "addi %0, 1, %0\n\t"
78  "andi %1, 1, %3\n\t"
79  "beqi %3, 1, tr0\n"
80  "1:\n\t"
81  "ptabs %2, tr0\n\t"
82  : "=r" (result), "=r" (word), "=r" (__d2), "=r" (__d3)
83  : "0" (0L), "1" (word));
84 
85  return result;
86 }
87 
89 #endif
90 
92 #include <asm-generic/bitops/ffs.h>
96 #include <asm-generic/bitops/le.h>
98 #include <asm-generic/bitops/fls.h>
101 
102 #endif /* __KERNEL__ */
103 
104 #endif /* __ASM_SH_BITOPS_H */