Skip to content

Commit

Permalink
lib: add weak clz/ctz functions
Browse files Browse the repository at this point in the history
Some architectures need __c[lt]z[sd]i2() for __builtin_c[lt]z[ll] and
that causes a build failure.  They can be implemented using the
fls()/__ffs() and overridden by linking arch-specific versions may not
be implemented yet.

This is required by "lib: add lz4 compressor module".

Reference: https://lkml.org/lkml/2013/4/18/603

Signed-off-by: Chanho Min <[email protected]>
Reported-by: Geert Uytterhoeven <[email protected]>
Cc: "Darrick J. Wong" <[email protected]>
Cc: Bob Pearson <[email protected]>
Cc: Richard Weinberger <[email protected]>
Cc: Herbert Xu <[email protected]>
Cc: Yann Collet <[email protected]>
Cc: Kyungsik Lee <[email protected]>
Signed-off-by: Andrew Morton <[email protected]>
Signed-off-by: Linus Torvalds <[email protected]>
  • Loading branch information
Chanho Min authored and torvalds committed Jul 9, 2013
1 parent 1b3a5d0 commit 4df87bb
Show file tree
Hide file tree
Showing 2 changed files with 59 additions and 1 deletion.
2 changes: 1 addition & 1 deletion lib/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ lib-y += kobject.o klist.o

obj-y += bcd.o div64.o sort.o parser.o halfmd4.o debug_locks.o random32.o \
bust_spinlocks.o hexdump.o kasprintf.o bitmap.o scatterlist.o \
gcd.o lcm.o list_sort.o uuid.o flex_array.o iovec.o \
gcd.o lcm.o list_sort.o uuid.o flex_array.o iovec.o clz_ctz.o \
bsearch.o find_last_bit.o find_next_bit.o llist.o memweight.o kfifo.o
obj-y += string_helpers.o
obj-$(CONFIG_TEST_STRING_HELPERS) += test-string_helpers.o
Expand Down
58 changes: 58 additions & 0 deletions lib/clz_ctz.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
/*
* lib/clz_ctz.c
*
* Copyright (C) 2013 Chanho Min <[email protected]>
*
* 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.
*
* __c[lt]z[sd]i2 can be overridden by linking arch-specific versions.
*/

#include <linux/export.h>
#include <linux/kernel.h>

int __weak __ctzsi2(int val)
{
return __ffs(val);
}
EXPORT_SYMBOL(__ctzsi2);

int __weak __clzsi2(int val)
{
return 32 - fls(val);
}
EXPORT_SYMBOL(__clzsi2);

#if BITS_PER_LONG == 32

int __weak __clzdi2(long val)
{
return 32 - fls((int)val);
}
EXPORT_SYMBOL(__clzdi2);

int __weak __ctzdi2(long val)
{
return __ffs((u32)val);
}
EXPORT_SYMBOL(__ctzdi2);

#elif BITS_PER_LONG == 64

int __weak __clzdi2(long val)
{
return 64 - fls64((u64)val);
}
EXPORT_SYMBOL(__clzdi2);

int __weak __ctzdi2(long val)
{
return __ffs64((u64)val);
}
EXPORT_SYMBOL(__ctzdi2);

#else
#error BITS_PER_LONG not 32 or 64
#endif

0 comments on commit 4df87bb

Please sign in to comment.