1/* SPDX-License-Identifier: GPL-2.0 */
2
3#ifndef __ASM_CSKY_BITOPS_H
4#define __ASM_CSKY_BITOPS_H
5
6#include <linux/compiler.h>
7#include <asm/barrier.h>
8
9/*
10 * asm-generic/bitops/ffs.h
11 */
12static inline int ffs(int x)
13{
14	if (!x)
15		return 0;
16
17	asm volatile (
18		"brev %0\n"
19		"ff1  %0\n"
20		"addi %0, 1\n"
21		: "=&r"(x)
22		: "0"(x));
23	return x;
24}
25
26/*
27 * asm-generic/bitops/__ffs.h
28 */
29static __always_inline unsigned long __ffs(unsigned long x)
30{
31	asm volatile (
32		"brev %0\n"
33		"ff1  %0\n"
34		: "=&r"(x)
35		: "0"(x));
36	return x;
37}
38
39/*
40 * asm-generic/bitops/fls.h
41 */
42static __always_inline int fls(unsigned int x)
43{
44	asm volatile(
45		"ff1 %0\n"
46		: "=&r"(x)
47		: "0"(x));
48
49	return (32 - x);
50}
51
52/*
53 * asm-generic/bitops/__fls.h
54 */
55static __always_inline unsigned long __fls(unsigned long x)
56{
57	return fls(x) - 1;
58}
59
60#include <asm-generic/bitops/ffz.h>
61#include <asm-generic/bitops/fls64.h>
62
63#ifndef _LINUX_BITOPS_H
64#error only <linux/bitops.h> can be included directly
65#endif
66
67#include <asm-generic/bitops/sched.h>
68#include <asm-generic/bitops/hweight.h>
69#include <asm-generic/bitops/lock.h>
70#include <asm-generic/bitops/atomic.h>
71
72/*
73 * bug fix, why only could use atomic!!!!
74 */
75#include <asm-generic/bitops/non-atomic.h>
76
77#include <asm-generic/bitops/le.h>
78#include <asm-generic/bitops/ext2-atomic.h>
79#endif /* __ASM_CSKY_BITOPS_H */
80