diff options
Diffstat (limited to 'arch/c6x/include/asm/bitops.h')
-rw-r--r-- | arch/c6x/include/asm/bitops.h | 105 |
1 files changed, 105 insertions, 0 deletions
diff --git a/arch/c6x/include/asm/bitops.h b/arch/c6x/include/asm/bitops.h new file mode 100644 index 00000000000..39ab7e874d9 --- /dev/null +++ b/arch/c6x/include/asm/bitops.h | |||
@@ -0,0 +1,105 @@ | |||
1 | /* | ||
2 | * Port on Texas Instruments TMS320C6x architecture | ||
3 | * | ||
4 | * Copyright (C) 2004, 2009, 2010 Texas Instruments Incorporated | ||
5 | * Author: Aurelien Jacquiot (aurelien.jacquiot@jaluna.com) | ||
6 | * | ||
7 | * This program is free software; you can redistribute it and/or modify | ||
8 | * it under the terms of the GNU General Public License version 2 as | ||
9 | * published by the Free Software Foundation. | ||
10 | */ | ||
11 | #ifndef _ASM_C6X_BITOPS_H | ||
12 | #define _ASM_C6X_BITOPS_H | ||
13 | |||
14 | #ifdef __KERNEL__ | ||
15 | |||
16 | #include <linux/bitops.h> | ||
17 | |||
18 | #include <asm/system.h> | ||
19 | #include <asm/byteorder.h> | ||
20 | |||
21 | /* | ||
22 | * clear_bit() doesn't provide any barrier for the compiler. | ||
23 | */ | ||
24 | #define smp_mb__before_clear_bit() barrier() | ||
25 | #define smp_mb__after_clear_bit() barrier() | ||
26 | |||
27 | /* | ||
28 | * We are lucky, DSP is perfect for bitops: do it in 3 cycles | ||
29 | */ | ||
30 | |||
31 | /** | ||
32 | * __ffs - find first bit in word. | ||
33 | * @word: The word to search | ||
34 | * | ||
35 | * Undefined if no bit exists, so code should check against 0 first. | ||
36 | * Note __ffs(0) = undef, __ffs(1) = 0, __ffs(0x80000000) = 31. | ||
37 | * | ||
38 | */ | ||
39 | static inline unsigned long __ffs(unsigned long x) | ||
40 | { | ||
41 | asm (" bitr .M1 %0,%0\n" | ||
42 | " nop\n" | ||
43 | " lmbd .L1 1,%0,%0\n" | ||
44 | : "+a"(x)); | ||
45 | |||
46 | return x; | ||
47 | } | ||
48 | |||
49 | /* | ||
50 | * ffz - find first zero in word. | ||
51 | * @word: The word to search | ||
52 | * | ||
53 | * Undefined if no zero exists, so code should check against ~0UL first. | ||
54 | */ | ||
55 | #define ffz(x) __ffs(~(x)) | ||
56 | |||
57 | /** | ||
58 | * fls - find last (most-significant) bit set | ||
59 | * @x: the word to search | ||
60 | * | ||
61 | * This is defined the same way as ffs. | ||
62 | * Note fls(0) = 0, fls(1) = 1, fls(0x80000000) = 32. | ||
63 | */ | ||
64 | static inline int fls(int x) | ||
65 | { | ||
66 | if (!x) | ||
67 | return 0; | ||
68 | |||
69 | asm (" lmbd .L1 1,%0,%0\n" : "+a"(x)); | ||
70 | |||
71 | return 32 - x; | ||
72 | } | ||
73 | |||
74 | /** | ||
75 | * ffs - find first bit set | ||
76 | * @x: the word to search | ||
77 | * | ||
78 | * This is defined the same way as | ||
79 | * the libc and compiler builtin ffs routines, therefore | ||
80 | * differs in spirit from the above ffz (man ffs). | ||
81 | * Note ffs(0) = 0, ffs(1) = 1, ffs(0x80000000) = 32. | ||
82 | */ | ||
83 | static inline int ffs(int x) | ||
84 | { | ||
85 | if (!x) | ||
86 | return 0; | ||
87 | |||
88 | return __ffs(x) + 1; | ||
89 | } | ||
90 | |||
91 | #include <asm-generic/bitops/__fls.h> | ||
92 | #include <asm-generic/bitops/fls64.h> | ||
93 | #include <asm-generic/bitops/find.h> | ||
94 | |||
95 | #include <asm-generic/bitops/sched.h> | ||
96 | #include <asm-generic/bitops/hweight.h> | ||
97 | #include <asm-generic/bitops/lock.h> | ||
98 | |||
99 | #include <asm-generic/bitops/atomic.h> | ||
100 | #include <asm-generic/bitops/non-atomic.h> | ||
101 | #include <asm-generic/bitops/le.h> | ||
102 | #include <asm-generic/bitops/ext2-atomic.h> | ||
103 | |||
104 | #endif /* __KERNEL__ */ | ||
105 | #endif /* _ASM_C6X_BITOPS_H */ | ||