Blame view

include/linux/count_zeros.h 1.62 KB
aacf29bf1   David Howells   MPILIB: Provide c...
1
2
3
4
5
6
7
8
9
10
  /* Count leading and trailing zeros functions
   *
   * Copyright (C) 2012 Red Hat, Inc. All Rights Reserved.
   * Written by David Howells (dhowells@redhat.com)
   *
   * 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.
   */
a1164a3ac   Christoph Hellwig   move count_zeroes...
11
12
  #ifndef _LINUX_BITOPS_COUNT_ZEROS_H_
  #define _LINUX_BITOPS_COUNT_ZEROS_H_
aacf29bf1   David Howells   MPILIB: Provide c...
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
  
  #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;
  }
a1164a3ac   Christoph Hellwig   move count_zeroes...
55
  #endif /* _LINUX_BITOPS_COUNT_ZEROS_H_ */