diff options
Diffstat (limited to 'include/asm-cris/arch-v32/bitops.h')
-rw-r--r-- | include/asm-cris/arch-v32/bitops.h | 64 |
1 files changed, 64 insertions, 0 deletions
diff --git a/include/asm-cris/arch-v32/bitops.h b/include/asm-cris/arch-v32/bitops.h new file mode 100644 index 000000000000..e40a58d3b862 --- /dev/null +++ b/include/asm-cris/arch-v32/bitops.h | |||
@@ -0,0 +1,64 @@ | |||
1 | #ifndef _ASM_CRIS_ARCH_BITOPS_H | ||
2 | #define _ASM_CRIS_ARCH_BITOPS_H | ||
3 | |||
4 | /* | ||
5 | * Helper functions for the core of the ff[sz] functions. They compute the | ||
6 | * number of leading zeroes of a bits-in-byte, byte-in-word and | ||
7 | * word-in-dword-swapped number. They differ in that the first function also | ||
8 | * inverts all bits in the input. | ||
9 | */ | ||
10 | |||
11 | extern inline unsigned long | ||
12 | cris_swapnwbrlz(unsigned long w) | ||
13 | { | ||
14 | unsigned long res; | ||
15 | |||
16 | __asm__ __volatile__ ("swapnwbr %0\n\t" | ||
17 | "lz %0,%0" | ||
18 | : "=r" (res) : "0" (w)); | ||
19 | |||
20 | return res; | ||
21 | } | ||
22 | |||
23 | extern inline unsigned long | ||
24 | cris_swapwbrlz(unsigned long w) | ||
25 | { | ||
26 | unsigned long res; | ||
27 | |||
28 | __asm__ __volatile__ ("swapwbr %0\n\t" | ||
29 | "lz %0,%0" | ||
30 | : "=r" (res) : "0" (w)); | ||
31 | |||
32 | return res; | ||
33 | } | ||
34 | |||
35 | /* | ||
36 | * Find First Zero in word. Undefined if no zero exist, so the caller should | ||
37 | * check against ~0 first. | ||
38 | */ | ||
39 | extern inline unsigned long | ||
40 | ffz(unsigned long w) | ||
41 | { | ||
42 | return cris_swapnwbrlz(w); | ||
43 | } | ||
44 | |||
45 | /* | ||
46 | * Find First Set bit in word. Undefined if no 1 exist, so the caller | ||
47 | * should check against 0 first. | ||
48 | */ | ||
49 | extern inline unsigned long | ||
50 | __ffs(unsigned long w) | ||
51 | { | ||
52 | return cris_swapnwbrlz(~w); | ||
53 | } | ||
54 | |||
55 | /* | ||
56 | * Find First Bit that is set. | ||
57 | */ | ||
58 | extern inline unsigned long | ||
59 | kernel_ffs(unsigned long w) | ||
60 | { | ||
61 | return w ? cris_swapwbrlz (w) + 1 : 0; | ||
62 | } | ||
63 | |||
64 | #endif /* _ASM_CRIS_ARCH_BITOPS_H */ | ||