mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-08-23 09:19:51 +00:00
![Thomas Gleixner](/assets/img/avatar_default.png)
Based on 1 normalized pattern(s): this program is free software you can redistribute it and or modify it under the terms of the gnu general public licence as published by the free software foundation either version 2 of the licence or at your option any later version extracted by the scancode license scanner the SPDX license identifier GPL-2.0-or-later has been chosen to replace the boilerplate/reference in 114 file(s). Signed-off-by: Thomas Gleixner <tglx@linutronix.de> Reviewed-by: Allison Randal <allison@lohutok.net> Reviewed-by: Kate Stewart <kstewart@linuxfoundation.org> Cc: linux-spdx@vger.kernel.org Link: https://lkml.kernel.org/r/20190520170857.552531963@linutronix.de Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
53 lines
1.4 KiB
C
53 lines
1.4 KiB
C
/* SPDX-License-Identifier: GPL-2.0-or-later */
|
|
/* Count leading and trailing zeros functions
|
|
*
|
|
* Copyright (C) 2012 Red Hat, Inc. All Rights Reserved.
|
|
* Written by David Howells (dhowells@redhat.com)
|
|
*/
|
|
|
|
#ifndef _LINUX_BITOPS_COUNT_ZEROS_H_
|
|
#define _LINUX_BITOPS_COUNT_ZEROS_H_
|
|
|
|
#include <asm/bitops.h>
|
|
|
|
/**
|
|
* count_leading_zeros - Count the number of zeros from the MSB back
|
|
* @x: The value
|
|
*
|
|
* Count the number of leading zeros from the MSB going towards the LSB in @x.
|
|
*
|
|
* If the MSB of @x is set, the result is 0.
|
|
* If only the LSB of @x is set, then the result is BITS_PER_LONG-1.
|
|
* If @x is 0 then the result is COUNT_LEADING_ZEROS_0.
|
|
*/
|
|
static inline int count_leading_zeros(unsigned long x)
|
|
{
|
|
if (sizeof(x) == 4)
|
|
return BITS_PER_LONG - fls(x);
|
|
else
|
|
return BITS_PER_LONG - fls64(x);
|
|
}
|
|
|
|
#define COUNT_LEADING_ZEROS_0 BITS_PER_LONG
|
|
|
|
/**
|
|
* count_trailing_zeros - Count the number of zeros from the LSB forwards
|
|
* @x: The value
|
|
*
|
|
* Count the number of trailing zeros from the LSB going towards the MSB in @x.
|
|
*
|
|
* If the LSB of @x is set, the result is 0.
|
|
* If only the MSB of @x is set, then the result is BITS_PER_LONG-1.
|
|
* If @x is 0 then the result is COUNT_TRAILING_ZEROS_0.
|
|
*/
|
|
static inline int count_trailing_zeros(unsigned long x)
|
|
{
|
|
#define COUNT_TRAILING_ZEROS_0 (-1)
|
|
|
|
if (sizeof(x) == 4)
|
|
return ffs(x);
|
|
else
|
|
return (x != 0) ? __ffs(x) : COUNT_TRAILING_ZEROS_0;
|
|
}
|
|
|
|
#endif /* _LINUX_BITOPS_COUNT_ZEROS_H_ */
|