Skip to content
  • David Howells's avatar
    [PATCH] LOG2: Implement a general integer log2 facility in the kernel · f0d1b0b3
    David Howells authored
    
    
    This facility provides three entry points:
    
    	ilog2()		Log base 2 of unsigned long
    	ilog2_u32()	Log base 2 of u32
    	ilog2_u64()	Log base 2 of u64
    
    These facilities can either be used inside functions on dynamic data:
    
    	int do_something(long q)
    	{
    		...;
    		y = ilog2(x)
    		...;
    	}
    
    Or can be used to statically initialise global variables with constant values:
    
    	unsigned n = ilog2(27);
    
    When performing static initialisation, the compiler will report "error:
    initializer element is not constant" if asked to take a log of zero or of
    something not reducible to a constant.  They treat negative numbers as
    unsigned.
    
    When not dealing with a constant, they fall back to using fls() which permits
    them to use arch-specific log calculation instructions - such as BSR on
    x86/x86_64 or SCAN on FRV - if available.
    
    [akpm@osdl.org: MMC fix]
    Signed-off-by: default avatarDavid Howells <dhowells@redhat.com>
    Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org>
    Cc: Paul Mackerras <paulus@samba.org>
    Cc: Herbert Xu <herbert@gondor.apana.org.au>
    Cc: David Howells <dhowells@redhat.com>
    Cc: Wojtek Kaniewski <wojtekka@toxygen.net>
    Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
    f0d1b0b3