clz_ctz.c 1.3 KB
Newer Older
Chanho Min's avatar
Chanho Min committed
1 2 3 4 5 6 7 8
/*
 * lib/clz_ctz.c
 *
 * Copyright (C) 2013 Chanho Min <chanho.min@lge.com>
 *
 * 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.
9 10 11
 * The functions in this file aren't called directly, but are required by
 * GCC builtins such as __builtin_ctz, and therefore they can't be removed
 * despite appearing unreferenced in kernel source.
Chanho Min's avatar
Chanho Min committed
12 13 14 15 16 17 18
 *
 * __c[lt]z[sd]i2 can be overridden by linking arch-specific versions.
 */

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

19
int __weak __ctzsi2(int val);
Chanho Min's avatar
Chanho Min committed
20 21 22 23 24 25
int __weak __ctzsi2(int val)
{
	return __ffs(val);
}
EXPORT_SYMBOL(__ctzsi2);

26
int __weak __clzsi2(int val);
Chanho Min's avatar
Chanho Min committed
27 28 29 30 31 32
int __weak __clzsi2(int val)
{
	return 32 - fls(val);
}
EXPORT_SYMBOL(__clzsi2);

33 34
int __weak __clzdi2(long val);
int __weak __ctzdi2(long val);
Chanho Min's avatar
Chanho Min committed
35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65
#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