bitmap: introduce bitmap_weighted_xor()
The function helps to XOR bitmaps and calculate Hamming weight of the result in one pass. Reviewed-by: Aleksandr Loktionov <aleksandr.loktionov@intel.com> Reviewed-by: Jacob Keller <jacob.e.keller@intel.com> Signed-off-by: Yury Norov <ynorov@nvidia.com>master
parent
95d324fb1b
commit
d57e74f104
|
|
@ -46,6 +46,7 @@ struct device;
|
||||||
* bitmap_and(dst, src1, src2, nbits) *dst = *src1 & *src2
|
* bitmap_and(dst, src1, src2, nbits) *dst = *src1 & *src2
|
||||||
* bitmap_or(dst, src1, src2, nbits) *dst = *src1 | *src2
|
* bitmap_or(dst, src1, src2, nbits) *dst = *src1 | *src2
|
||||||
* bitmap_weighted_or(dst, src1, src2, nbits) *dst = *src1 | *src2. Returns Hamming Weight of dst
|
* bitmap_weighted_or(dst, src1, src2, nbits) *dst = *src1 | *src2. Returns Hamming Weight of dst
|
||||||
|
* bitmap_weighted_xor(dst, src1, src2, nbits) *dst = *src1 ^ *src2. Returns Hamming Weight of dst
|
||||||
* bitmap_xor(dst, src1, src2, nbits) *dst = *src1 ^ *src2
|
* bitmap_xor(dst, src1, src2, nbits) *dst = *src1 ^ *src2
|
||||||
* bitmap_andnot(dst, src1, src2, nbits) *dst = *src1 & ~(*src2)
|
* bitmap_andnot(dst, src1, src2, nbits) *dst = *src1 & ~(*src2)
|
||||||
* bitmap_complement(dst, src, nbits) *dst = ~(*src)
|
* bitmap_complement(dst, src, nbits) *dst = ~(*src)
|
||||||
|
|
@ -169,6 +170,8 @@ void __bitmap_or(unsigned long *dst, const unsigned long *bitmap1,
|
||||||
const unsigned long *bitmap2, unsigned int nbits);
|
const unsigned long *bitmap2, unsigned int nbits);
|
||||||
unsigned int __bitmap_weighted_or(unsigned long *dst, const unsigned long *bitmap1,
|
unsigned int __bitmap_weighted_or(unsigned long *dst, const unsigned long *bitmap1,
|
||||||
const unsigned long *bitmap2, unsigned int nbits);
|
const unsigned long *bitmap2, unsigned int nbits);
|
||||||
|
unsigned int __bitmap_weighted_xor(unsigned long *dst, const unsigned long *bitmap1,
|
||||||
|
const unsigned long *bitmap2, unsigned int nbits);
|
||||||
void __bitmap_xor(unsigned long *dst, const unsigned long *bitmap1,
|
void __bitmap_xor(unsigned long *dst, const unsigned long *bitmap1,
|
||||||
const unsigned long *bitmap2, unsigned int nbits);
|
const unsigned long *bitmap2, unsigned int nbits);
|
||||||
bool __bitmap_andnot(unsigned long *dst, const unsigned long *bitmap1,
|
bool __bitmap_andnot(unsigned long *dst, const unsigned long *bitmap1,
|
||||||
|
|
@ -353,6 +356,18 @@ unsigned int bitmap_weighted_or(unsigned long *dst, const unsigned long *src1,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static __always_inline
|
||||||
|
unsigned int bitmap_weighted_xor(unsigned long *dst, const unsigned long *src1,
|
||||||
|
const unsigned long *src2, unsigned int nbits)
|
||||||
|
{
|
||||||
|
if (small_const_nbits(nbits)) {
|
||||||
|
*dst = *src1 ^ *src2;
|
||||||
|
return hweight_long(*dst & BITMAP_LAST_WORD_MASK(nbits));
|
||||||
|
} else {
|
||||||
|
return __bitmap_weighted_xor(dst, src1, src2, nbits);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static __always_inline
|
static __always_inline
|
||||||
void bitmap_xor(unsigned long *dst, const unsigned long *src1,
|
void bitmap_xor(unsigned long *dst, const unsigned long *src1,
|
||||||
const unsigned long *src2, unsigned int nbits)
|
const unsigned long *src2, unsigned int nbits)
|
||||||
|
|
|
||||||
|
|
@ -363,6 +363,13 @@ unsigned int __bitmap_weighted_or(unsigned long *dst, const unsigned long *bitma
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(__bitmap_weighted_or);
|
EXPORT_SYMBOL(__bitmap_weighted_or);
|
||||||
|
|
||||||
|
unsigned int __bitmap_weighted_xor(unsigned long *dst, const unsigned long *bitmap1,
|
||||||
|
const unsigned long *bitmap2, unsigned int bits)
|
||||||
|
{
|
||||||
|
return BITMAP_WEIGHT(({dst[idx] = bitmap1[idx] ^ bitmap2[idx]; dst[idx]; }), bits);
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL(__bitmap_weighted_xor);
|
||||||
|
|
||||||
void __bitmap_set(unsigned long *map, unsigned int start, int len)
|
void __bitmap_set(unsigned long *map, unsigned int start, int len)
|
||||||
{
|
{
|
||||||
unsigned long *p = map + BIT_WORD(start);
|
unsigned long *p = map + BIT_WORD(start);
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue