mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 02:30:34 +02:00 
			
		
		
		
	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>
		
			
				
	
	
		
			49 lines
		
	
	
	
		
			1.2 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			49 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__ */
 |