forked from Minki/linux
3fc2579e6f
When testing in userspace, UBSAN pointed out that shifting into the sign bit is undefined behaviour. It doesn't really make sense to ask for the highest set bit of a negative value, so just turn the argument type into an unsigned int. Some architectures (eg ppc) already had it declared as an unsigned int, so I don't expect too many problems. Link: http://lkml.kernel.org/r/20181105221117.31828-1-willy@infradead.org Signed-off-by: Matthew Wilcox <willy@infradead.org> Acked-by: Thomas Gleixner <tglx@linutronix.de> Acked-by: Geert Uytterhoeven <geert@linux-m68k.org> Cc: <linux-arch@vger.kernel.org> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
50 lines
1.2 KiB
C
50 lines
1.2 KiB
C
/*
|
|
* linux/arch/unicore32/include/asm/bitops.h
|
|
*
|
|
* Code specific to PKUnity SoC and UniCore ISA
|
|
*
|
|
* Copyright (C) 2001-2010 GUAN Xue-tao
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License version 2 as
|
|
* published by the Free Software Foundation.
|
|
*/
|
|
|
|
#ifndef __UNICORE_BITOPS_H__
|
|
#define __UNICORE_BITOPS_H__
|
|
|
|
#define _ASM_GENERIC_BITOPS_FLS_H_
|
|
#define _ASM_GENERIC_BITOPS___FLS_H_
|
|
#define _ASM_GENERIC_BITOPS_FFS_H_
|
|
#define _ASM_GENERIC_BITOPS___FFS_H_
|
|
/*
|
|
* On UNICORE, those functions can be implemented around
|
|
* the cntlz instruction for much better code efficiency.
|
|
*/
|
|
|
|
static inline int fls(unsigned int x)
|
|
{
|
|
int ret;
|
|
|
|
asm("cntlz\t%0, %1" : "=r" (ret) : "r" (x) : "cc");
|
|
ret = 32 - ret;
|
|
|
|
return ret;
|
|
}
|
|
|
|
#define __fls(x) (fls(x) - 1)
|
|
#define ffs(x) ({ unsigned long __t = (x); fls(__t & -__t); })
|
|
#define __ffs(x) (ffs(x) - 1)
|
|
|
|
#include <asm-generic/bitops.h>
|
|
|
|
/* following definitions: to avoid using codes in lib/find_*.c */
|
|
#define find_next_bit find_next_bit
|
|
#define find_next_zero_bit find_next_zero_bit
|
|
#define find_first_bit find_first_bit
|
|
#define find_first_zero_bit find_first_zero_bit
|
|
|
|
#include <asm-generic/bitops/find.h>
|
|
|
|
#endif /* __UNICORE_BITOPS_H__ */
|