1 // SPDX-License-Identifier: GPL-2.0-only
4 * Helper functions for bitmap.h.
6 #include <linux/bitmap.h>
8 int __bitmap_weight(const unsigned long *bitmap
, int bits
)
10 int k
, w
= 0, lim
= bits
/BITS_PER_LONG
;
12 for (k
= 0; k
< lim
; k
++)
13 w
+= hweight_long(bitmap
[k
]);
15 if (bits
% BITS_PER_LONG
)
16 w
+= hweight_long(bitmap
[k
] & BITMAP_LAST_WORD_MASK(bits
));
21 void __bitmap_or(unsigned long *dst
, const unsigned long *bitmap1
,
22 const unsigned long *bitmap2
, int bits
)
25 int nr
= BITS_TO_LONGS(bits
);
27 for (k
= 0; k
< nr
; k
++)
28 dst
[k
] = bitmap1
[k
] | bitmap2
[k
];
31 size_t bitmap_scnprintf(unsigned long *bitmap
, int nbits
,
32 char *buf
, size_t size
)
34 /* current bit is 'cur', most recently seen range is [rbot, rtop] */
39 rbot
= cur
= find_first_bit(bitmap
, nbits
);
42 cur
= find_next_bit(bitmap
, nbits
, cur
+ 1);
43 if (cur
< nbits
&& cur
<= rtop
+ 1)
47 ret
+= scnprintf(buf
+ ret
, size
- ret
, ",");
51 ret
+= scnprintf(buf
+ ret
, size
- ret
, "%d", rbot
);
53 ret
+= scnprintf(buf
+ ret
, size
- ret
, "-%d", rtop
);
60 int __bitmap_and(unsigned long *dst
, const unsigned long *bitmap1
,
61 const unsigned long *bitmap2
, unsigned int bits
)
64 unsigned int lim
= bits
/BITS_PER_LONG
;
65 unsigned long result
= 0;
67 for (k
= 0; k
< lim
; k
++)
68 result
|= (dst
[k
] = bitmap1
[k
] & bitmap2
[k
]);
69 if (bits
% BITS_PER_LONG
)
70 result
|= (dst
[k
] = bitmap1
[k
] & bitmap2
[k
] &
71 BITMAP_LAST_WORD_MASK(bits
));
75 int __bitmap_equal(const unsigned long *bitmap1
,
76 const unsigned long *bitmap2
, unsigned int bits
)
78 unsigned int k
, lim
= bits
/BITS_PER_LONG
;
79 for (k
= 0; k
< lim
; ++k
)
80 if (bitmap1
[k
] != bitmap2
[k
])
83 if (bits
% BITS_PER_LONG
)
84 if ((bitmap1
[k
] ^ bitmap2
[k
]) & BITMAP_LAST_WORD_MASK(bits
))