1 /* 2 * linux/arch/unicore32/include/asm/bitops.h 3 * 4 * Code specific to PKUnity SoC and UniCore ISA 5 * 6 * Copyright (C) 2001-2010 GUAN Xue-tao 7 * 8 * This program is free software; you can redistribute it and/or modify 9 * it under the terms of the GNU General Public License version 2 as 10 * published by the Free Software Foundation. 11 */ 12 13 #ifndef __UNICORE_BITOPS_H__ 14 #define __UNICORE_BITOPS_H__ 15 16 #define _ASM_GENERIC_BITOPS_FLS_H_ 17 #define _ASM_GENERIC_BITOPS___FLS_H_ 18 #define _ASM_GENERIC_BITOPS_FFS_H_ 19 #define _ASM_GENERIC_BITOPS___FFS_H_ 20 /* 21 * On UNICORE, those functions can be implemented around 22 * the cntlz instruction for much better code efficiency. 23 */ 24 fls(int x)25static inline int fls(int x) 26 { 27 int ret; 28 29 asm("cntlz\t%0, %1" : "=r" (ret) : "r" (x) : "cc"); 30 ret = 32 - ret; 31 32 return ret; 33 } 34 35 #define __fls(x) (fls(x) - 1) 36 #define ffs(x) ({ unsigned long __t = (x); fls(__t & -__t); }) 37 #define __ffs(x) (ffs(x) - 1) 38 39 #include <asm-generic/bitops.h> 40 41 /* following definitions: to avoid using codes in lib/find_*.c */ 42 #define find_next_bit find_next_bit 43 #define find_next_zero_bit find_next_zero_bit 44 #define find_first_bit find_first_bit 45 #define find_first_zero_bit find_first_zero_bit 46 47 #endif /* __UNICORE_BITOPS_H__ */ 48