162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */
262306a36Sopenharmony_ci
362306a36Sopenharmony_ci#ifndef __ASM_CSKY_BITOPS_H
462306a36Sopenharmony_ci#define __ASM_CSKY_BITOPS_H
562306a36Sopenharmony_ci
662306a36Sopenharmony_ci#include <linux/compiler.h>
762306a36Sopenharmony_ci#include <asm/barrier.h>
862306a36Sopenharmony_ci
962306a36Sopenharmony_ci/*
1062306a36Sopenharmony_ci * asm-generic/bitops/ffs.h
1162306a36Sopenharmony_ci */
1262306a36Sopenharmony_cistatic inline int ffs(int x)
1362306a36Sopenharmony_ci{
1462306a36Sopenharmony_ci	if (!x)
1562306a36Sopenharmony_ci		return 0;
1662306a36Sopenharmony_ci
1762306a36Sopenharmony_ci	asm volatile (
1862306a36Sopenharmony_ci		"brev %0\n"
1962306a36Sopenharmony_ci		"ff1  %0\n"
2062306a36Sopenharmony_ci		"addi %0, 1\n"
2162306a36Sopenharmony_ci		: "=&r"(x)
2262306a36Sopenharmony_ci		: "0"(x));
2362306a36Sopenharmony_ci	return x;
2462306a36Sopenharmony_ci}
2562306a36Sopenharmony_ci
2662306a36Sopenharmony_ci/*
2762306a36Sopenharmony_ci * asm-generic/bitops/__ffs.h
2862306a36Sopenharmony_ci */
2962306a36Sopenharmony_cistatic __always_inline unsigned long __ffs(unsigned long x)
3062306a36Sopenharmony_ci{
3162306a36Sopenharmony_ci	asm volatile (
3262306a36Sopenharmony_ci		"brev %0\n"
3362306a36Sopenharmony_ci		"ff1  %0\n"
3462306a36Sopenharmony_ci		: "=&r"(x)
3562306a36Sopenharmony_ci		: "0"(x));
3662306a36Sopenharmony_ci	return x;
3762306a36Sopenharmony_ci}
3862306a36Sopenharmony_ci
3962306a36Sopenharmony_ci/*
4062306a36Sopenharmony_ci * asm-generic/bitops/fls.h
4162306a36Sopenharmony_ci */
4262306a36Sopenharmony_cistatic __always_inline int fls(unsigned int x)
4362306a36Sopenharmony_ci{
4462306a36Sopenharmony_ci	asm volatile(
4562306a36Sopenharmony_ci		"ff1 %0\n"
4662306a36Sopenharmony_ci		: "=&r"(x)
4762306a36Sopenharmony_ci		: "0"(x));
4862306a36Sopenharmony_ci
4962306a36Sopenharmony_ci	return (32 - x);
5062306a36Sopenharmony_ci}
5162306a36Sopenharmony_ci
5262306a36Sopenharmony_ci/*
5362306a36Sopenharmony_ci * asm-generic/bitops/__fls.h
5462306a36Sopenharmony_ci */
5562306a36Sopenharmony_cistatic __always_inline unsigned long __fls(unsigned long x)
5662306a36Sopenharmony_ci{
5762306a36Sopenharmony_ci	return fls(x) - 1;
5862306a36Sopenharmony_ci}
5962306a36Sopenharmony_ci
6062306a36Sopenharmony_ci#include <asm-generic/bitops/ffz.h>
6162306a36Sopenharmony_ci#include <asm-generic/bitops/fls64.h>
6262306a36Sopenharmony_ci
6362306a36Sopenharmony_ci#ifndef _LINUX_BITOPS_H
6462306a36Sopenharmony_ci#error only <linux/bitops.h> can be included directly
6562306a36Sopenharmony_ci#endif
6662306a36Sopenharmony_ci
6762306a36Sopenharmony_ci#include <asm-generic/bitops/sched.h>
6862306a36Sopenharmony_ci#include <asm-generic/bitops/hweight.h>
6962306a36Sopenharmony_ci#include <asm-generic/bitops/lock.h>
7062306a36Sopenharmony_ci#include <asm-generic/bitops/atomic.h>
7162306a36Sopenharmony_ci
7262306a36Sopenharmony_ci/*
7362306a36Sopenharmony_ci * bug fix, why only could use atomic!!!!
7462306a36Sopenharmony_ci */
7562306a36Sopenharmony_ci#include <asm-generic/bitops/non-atomic.h>
7662306a36Sopenharmony_ci
7762306a36Sopenharmony_ci#include <asm-generic/bitops/le.h>
7862306a36Sopenharmony_ci#include <asm-generic/bitops/ext2-atomic.h>
7962306a36Sopenharmony_ci#endif /* __ASM_CSKY_BITOPS_H */
80