Blame view

tools/lib/bitmap.c 1.96 KB
40b0b3f8f   Thomas Gleixner   treewide: Replace...
1
  // SPDX-License-Identifier: GPL-2.0-only
fb72014d9   Arnaldo Carvalho de Melo   perf tools: Don't...
2
3
4
  /*
   * From lib/bitmap.c
   * Helper functions for bitmap.h.
fb72014d9   Arnaldo Carvalho de Melo   perf tools: Don't...
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
   */
  #include <linux/bitmap.h>
  
  int __bitmap_weight(const unsigned long *bitmap, int bits)
  {
  	int k, w = 0, lim = bits/BITS_PER_LONG;
  
  	for (k = 0; k < lim; k++)
  		w += hweight_long(bitmap[k]);
  
  	if (bits % BITS_PER_LONG)
  		w += hweight_long(bitmap[k] & BITMAP_LAST_WORD_MASK(bits));
  
  	return w;
  }
850f8127f   Jiri Olsa   perf tools: Add b...
20
21
22
23
24
25
26
27
28
29
  
  void __bitmap_or(unsigned long *dst, const unsigned long *bitmap1,
  		 const unsigned long *bitmap2, int bits)
  {
  	int k;
  	int nr = BITS_TO_LONGS(bits);
  
  	for (k = 0; k < nr; k++)
  		dst[k] = bitmap1[k] | bitmap2[k];
  }
820d12b70   Jiri Olsa   tools lib: Add bi...
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
55
56
57
58
  
  size_t bitmap_scnprintf(unsigned long *bitmap, int nbits,
  			char *buf, size_t size)
  {
  	/* current bit is 'cur', most recently seen range is [rbot, rtop] */
  	int cur, rbot, rtop;
  	bool first = true;
  	size_t ret = 0;
  
  	rbot = cur = find_first_bit(bitmap, nbits);
  	while (cur < nbits) {
  		rtop = cur;
  		cur = find_next_bit(bitmap, nbits, cur + 1);
  		if (cur < nbits && cur <= rtop + 1)
  			continue;
  
  		if (!first)
  			ret += scnprintf(buf + ret, size - ret, ",");
  
  		first = false;
  
  		ret += scnprintf(buf + ret, size - ret, "%d", rbot);
  		if (rbot < rtop)
  			ret += scnprintf(buf + ret, size - ret, "-%d", rtop);
  
  		rbot = cur;
  	}
  	return ret;
  }
741c74f55   Jiri Olsa   tools lib: Add bi...
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
  
  int __bitmap_and(unsigned long *dst, const unsigned long *bitmap1,
  		 const unsigned long *bitmap2, unsigned int bits)
  {
  	unsigned int k;
  	unsigned int lim = bits/BITS_PER_LONG;
  	unsigned long result = 0;
  
  	for (k = 0; k < lim; k++)
  		result |= (dst[k] = bitmap1[k] & bitmap2[k]);
  	if (bits % BITS_PER_LONG)
  		result |= (dst[k] = bitmap1[k] & bitmap2[k] &
  			   BITMAP_LAST_WORD_MASK(bits));
  	return result != 0;
  }
8812ad412   Alexey Budankov   tools bitmap: Imp...
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
  
  int __bitmap_equal(const unsigned long *bitmap1,
  		const unsigned long *bitmap2, unsigned int bits)
  {
  	unsigned int k, lim = bits/BITS_PER_LONG;
  	for (k = 0; k < lim; ++k)
  		if (bitmap1[k] != bitmap2[k])
  			return 0;
  
  	if (bits % BITS_PER_LONG)
  		if ((bitmap1[k] ^ bitmap2[k]) & BITMAP_LAST_WORD_MASK(bits))
  			return 0;
  
  	return 1;
  }