xref: /linux/arch/csky/include/asm/bitops.h (revision 03ab8e6297acd1bc0eedaa050e2a1635c576fd11)
1735ee005SGuo Ren /* SPDX-License-Identifier: GPL-2.0 */
2735ee005SGuo Ren 
3735ee005SGuo Ren #ifndef __ASM_CSKY_BITOPS_H
4735ee005SGuo Ren #define __ASM_CSKY_BITOPS_H
5735ee005SGuo Ren 
6735ee005SGuo Ren #include <linux/compiler.h>
7735ee005SGuo Ren #include <asm/barrier.h>
8735ee005SGuo Ren 
9735ee005SGuo Ren /*
10735ee005SGuo Ren  * asm-generic/bitops/ffs.h
11735ee005SGuo Ren  */
ffs(int x)12735ee005SGuo Ren static inline int ffs(int x)
13735ee005SGuo Ren {
14735ee005SGuo Ren 	if (!x)
15735ee005SGuo Ren 		return 0;
16735ee005SGuo Ren 
17735ee005SGuo Ren 	asm volatile (
18735ee005SGuo Ren 		"brev %0\n"
19735ee005SGuo Ren 		"ff1  %0\n"
20735ee005SGuo Ren 		"addi %0, 1\n"
21735ee005SGuo Ren 		: "=&r"(x)
22735ee005SGuo Ren 		: "0"(x));
23735ee005SGuo Ren 	return x;
24735ee005SGuo Ren }
25735ee005SGuo Ren 
26735ee005SGuo Ren /*
27735ee005SGuo Ren  * asm-generic/bitops/__ffs.h
28735ee005SGuo Ren  */
__ffs(unsigned long x)29735ee005SGuo Ren static __always_inline unsigned long __ffs(unsigned long x)
30735ee005SGuo Ren {
31735ee005SGuo Ren 	asm volatile (
32735ee005SGuo Ren 		"brev %0\n"
33735ee005SGuo Ren 		"ff1  %0\n"
34735ee005SGuo Ren 		: "=&r"(x)
35735ee005SGuo Ren 		: "0"(x));
36735ee005SGuo Ren 	return x;
37735ee005SGuo Ren }
38735ee005SGuo Ren 
39735ee005SGuo Ren /*
40735ee005SGuo Ren  * asm-generic/bitops/fls.h
41735ee005SGuo Ren  */
fls(unsigned int x)42*3fc2579eSMatthew Wilcox static __always_inline int fls(unsigned int x)
43735ee005SGuo Ren {
44735ee005SGuo Ren 	asm volatile(
45735ee005SGuo Ren 		"ff1 %0\n"
46735ee005SGuo Ren 		: "=&r"(x)
47735ee005SGuo Ren 		: "0"(x));
48735ee005SGuo Ren 
49735ee005SGuo Ren 	return (32 - x);
50735ee005SGuo Ren }
51735ee005SGuo Ren 
52735ee005SGuo Ren /*
53735ee005SGuo Ren  * asm-generic/bitops/__fls.h
54735ee005SGuo Ren  */
__fls(unsigned long x)55735ee005SGuo Ren static __always_inline unsigned long __fls(unsigned long x)
56735ee005SGuo Ren {
57735ee005SGuo Ren 	return fls(x) - 1;
58735ee005SGuo Ren }
59735ee005SGuo Ren 
60735ee005SGuo Ren #include <asm-generic/bitops/ffz.h>
61735ee005SGuo Ren #include <asm-generic/bitops/fls64.h>
62735ee005SGuo Ren 
63735ee005SGuo Ren #ifndef _LINUX_BITOPS_H
64735ee005SGuo Ren #error only <linux/bitops.h> can be included directly
65735ee005SGuo Ren #endif
66735ee005SGuo Ren 
67735ee005SGuo Ren #include <asm-generic/bitops/sched.h>
68735ee005SGuo Ren #include <asm-generic/bitops/hweight.h>
69735ee005SGuo Ren #include <asm-generic/bitops/lock.h>
70735ee005SGuo Ren #include <asm-generic/bitops/atomic.h>
71735ee005SGuo Ren 
72735ee005SGuo Ren /*
73735ee005SGuo Ren  * bug fix, why only could use atomic!!!!
74735ee005SGuo Ren  */
75735ee005SGuo Ren #include <asm-generic/bitops/non-atomic.h>
76735ee005SGuo Ren 
77735ee005SGuo Ren #include <asm-generic/bitops/le.h>
78735ee005SGuo Ren #include <asm-generic/bitops/ext2-atomic.h>
79735ee005SGuo Ren #endif /* __ASM_CSKY_BITOPS_H */
80