18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */ 28c2ecf20Sopenharmony_ci#ifndef __ASM_SH_BITOPS_H 38c2ecf20Sopenharmony_ci#define __ASM_SH_BITOPS_H 48c2ecf20Sopenharmony_ci 58c2ecf20Sopenharmony_ci#ifndef _LINUX_BITOPS_H 68c2ecf20Sopenharmony_ci#error only <linux/bitops.h> can be included directly 78c2ecf20Sopenharmony_ci#endif 88c2ecf20Sopenharmony_ci 98c2ecf20Sopenharmony_ci/* For __swab32 */ 108c2ecf20Sopenharmony_ci#include <asm/byteorder.h> 118c2ecf20Sopenharmony_ci#include <asm/barrier.h> 128c2ecf20Sopenharmony_ci 138c2ecf20Sopenharmony_ci#ifdef CONFIG_GUSA_RB 148c2ecf20Sopenharmony_ci#include <asm/bitops-grb.h> 158c2ecf20Sopenharmony_ci#elif defined(CONFIG_CPU_SH2A) 168c2ecf20Sopenharmony_ci#include <asm-generic/bitops/atomic.h> 178c2ecf20Sopenharmony_ci#include <asm/bitops-op32.h> 188c2ecf20Sopenharmony_ci#elif defined(CONFIG_CPU_SH4A) 198c2ecf20Sopenharmony_ci#include <asm/bitops-llsc.h> 208c2ecf20Sopenharmony_ci#elif defined(CONFIG_CPU_J2) && defined(CONFIG_SMP) 218c2ecf20Sopenharmony_ci#include <asm/bitops-cas.h> 228c2ecf20Sopenharmony_ci#else 238c2ecf20Sopenharmony_ci#include <asm-generic/bitops/atomic.h> 248c2ecf20Sopenharmony_ci#include <asm-generic/bitops/non-atomic.h> 258c2ecf20Sopenharmony_ci#endif 268c2ecf20Sopenharmony_ci 278c2ecf20Sopenharmony_cistatic inline unsigned long ffz(unsigned long word) 288c2ecf20Sopenharmony_ci{ 298c2ecf20Sopenharmony_ci unsigned long result; 308c2ecf20Sopenharmony_ci 318c2ecf20Sopenharmony_ci __asm__("1:\n\t" 328c2ecf20Sopenharmony_ci "shlr %1\n\t" 338c2ecf20Sopenharmony_ci "bt/s 1b\n\t" 348c2ecf20Sopenharmony_ci " add #1, %0" 358c2ecf20Sopenharmony_ci : "=r" (result), "=r" (word) 368c2ecf20Sopenharmony_ci : "0" (~0L), "1" (word) 378c2ecf20Sopenharmony_ci : "t"); 388c2ecf20Sopenharmony_ci return result; 398c2ecf20Sopenharmony_ci} 408c2ecf20Sopenharmony_ci 418c2ecf20Sopenharmony_ci/** 428c2ecf20Sopenharmony_ci * __ffs - find first bit in word. 438c2ecf20Sopenharmony_ci * @word: The word to search 448c2ecf20Sopenharmony_ci * 458c2ecf20Sopenharmony_ci * Undefined if no bit exists, so code should check against 0 first. 468c2ecf20Sopenharmony_ci */ 478c2ecf20Sopenharmony_cistatic inline unsigned long __ffs(unsigned long word) 488c2ecf20Sopenharmony_ci{ 498c2ecf20Sopenharmony_ci unsigned long result; 508c2ecf20Sopenharmony_ci 518c2ecf20Sopenharmony_ci __asm__("1:\n\t" 528c2ecf20Sopenharmony_ci "shlr %1\n\t" 538c2ecf20Sopenharmony_ci "bf/s 1b\n\t" 548c2ecf20Sopenharmony_ci " add #1, %0" 558c2ecf20Sopenharmony_ci : "=r" (result), "=r" (word) 568c2ecf20Sopenharmony_ci : "0" (~0L), "1" (word) 578c2ecf20Sopenharmony_ci : "t"); 588c2ecf20Sopenharmony_ci return result; 598c2ecf20Sopenharmony_ci} 608c2ecf20Sopenharmony_ci 618c2ecf20Sopenharmony_ci#include <asm-generic/bitops/find.h> 628c2ecf20Sopenharmony_ci#include <asm-generic/bitops/ffs.h> 638c2ecf20Sopenharmony_ci#include <asm-generic/bitops/hweight.h> 648c2ecf20Sopenharmony_ci#include <asm-generic/bitops/lock.h> 658c2ecf20Sopenharmony_ci#include <asm-generic/bitops/sched.h> 668c2ecf20Sopenharmony_ci#include <asm-generic/bitops/le.h> 678c2ecf20Sopenharmony_ci#include <asm-generic/bitops/ext2-atomic.h> 688c2ecf20Sopenharmony_ci#include <asm-generic/bitops/fls.h> 698c2ecf20Sopenharmony_ci#include <asm-generic/bitops/__fls.h> 708c2ecf20Sopenharmony_ci#include <asm-generic/bitops/fls64.h> 718c2ecf20Sopenharmony_ci 728c2ecf20Sopenharmony_ci#endif /* __ASM_SH_BITOPS_H */ 73