1c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#ifndef __LINUX_BITMAP_H 2c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define __LINUX_BITMAP_H 3c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 4c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#ifndef __ASSEMBLY__ 5c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 6c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#include <linux/types.h> 7c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#include <linux/bitops.h> 8c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#include <linux/string.h> 9c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 10c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* 11c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * bitmaps provide bit arrays that consume one or more unsigned 12c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * longs. The bitmap interface and available operations are listed 13c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * here, in bitmap.h 14c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * 15c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Function implementations generic to all architectures are in 16c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * lib/bitmap.c. Functions implementations that are architecture 17c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * specific are in various include/asm-<arch>/bitops.h headers 18c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * and other arch/<arch> specific files. 19c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * 20c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * See lib/bitmap.c for more details. 21c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 22c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 23c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* 24c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * The available bitmap operations and their rough meaning in the 25c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * case that the bitmap is a single unsigned long are thus: 26c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * 27c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Note that nbits should be always a compile time evaluable constant. 28c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Otherwise many inlines will generate horrible code. 29c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * 30c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * bitmap_zero(dst, nbits) *dst = 0UL 31c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * bitmap_fill(dst, nbits) *dst = ~0UL 32c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * bitmap_copy(dst, src, nbits) *dst = *src 33c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * bitmap_and(dst, src1, src2, nbits) *dst = *src1 & *src2 34c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * bitmap_or(dst, src1, src2, nbits) *dst = *src1 | *src2 35c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * bitmap_xor(dst, src1, src2, nbits) *dst = *src1 ^ *src2 36c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * bitmap_andnot(dst, src1, src2, nbits) *dst = *src1 & ~(*src2) 37c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * bitmap_complement(dst, src, nbits) *dst = ~(*src) 38c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * bitmap_equal(src1, src2, nbits) Are *src1 and *src2 equal? 39c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * bitmap_intersects(src1, src2, nbits) Do *src1 and *src2 overlap? 40c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * bitmap_subset(src1, src2, nbits) Is *src1 a subset of *src2? 41c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * bitmap_empty(src, nbits) Are all bits zero in *src? 42c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * bitmap_full(src, nbits) Are all bits set in *src? 43c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * bitmap_weight(src, nbits) Hamming Weight: number set bits 44c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * bitmap_shift_right(dst, src, n, nbits) *dst = *src >> n 45c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * bitmap_shift_left(dst, src, n, nbits) *dst = *src << n 46c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * bitmap_remap(dst, src, old, new, nbits) *dst = map(old, new)(src) 47c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * bitmap_bitremap(oldbit, old, new, nbits) newbit = map(old, new)(oldbit) 48c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * bitmap_scnprintf(buf, len, src, nbits) Print bitmap src to buf 49c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * bitmap_parse(ubuf, ulen, dst, nbits) Parse bitmap dst from user buf 50c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * bitmap_scnlistprintf(buf, len, src, nbits) Print bitmap src as list to buf 51c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * bitmap_parselist(buf, dst, nbits) Parse bitmap dst from list 52c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * bitmap_find_free_region(bitmap, bits, order) Find and allocate bit region 53c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * bitmap_release_region(bitmap, pos, order) Free specified bit region 54c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * bitmap_allocate_region(bitmap, pos, order) Allocate specified bit region 55c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 56c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 57c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* 58c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Also the following operations in asm/bitops.h apply to bitmaps. 59c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * 60c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * set_bit(bit, addr) *addr |= bit 61c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * clear_bit(bit, addr) *addr &= ~bit 62c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * change_bit(bit, addr) *addr ^= bit 63c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * test_bit(bit, addr) Is bit set in *addr? 64c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * test_and_set_bit(bit, addr) Set bit and return old value 65c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * test_and_clear_bit(bit, addr) Clear bit and return old value 66c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * test_and_change_bit(bit, addr) Change bit and return old value 67c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * find_first_zero_bit(addr, nbits) Position first zero bit in *addr 68c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * find_first_bit(addr, nbits) Position first set bit in *addr 69c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * find_next_zero_bit(addr, nbits, bit) Position next zero bit in *addr >= bit 70c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * find_next_bit(addr, nbits, bit) Position next set bit in *addr >= bit 71c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 72c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 73c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* 74c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * The DECLARE_BITMAP(name,bits) macro, in linux/types.h, can be used 75c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * to declare an array named 'name' of just enough unsigned longs to 76c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * contain all bit positions from 0 to 'bits' - 1. 77c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 78c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 79c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* 80c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * lib/bitmap.c provides these functions: 81c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 82c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 83c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern int __bitmap_empty(const unsigned long *bitmap, int bits); 84c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern int __bitmap_full(const unsigned long *bitmap, int bits); 85c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern int __bitmap_equal(const unsigned long *bitmap1, 86c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru const unsigned long *bitmap2, int bits); 87c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void __bitmap_complement(unsigned long *dst, const unsigned long *src, 88c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru int bits); 89c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void __bitmap_shift_right(unsigned long *dst, 90c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru const unsigned long *src, int shift, int bits); 91c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void __bitmap_shift_left(unsigned long *dst, 92c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru const unsigned long *src, int shift, int bits); 93c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void __bitmap_and(unsigned long *dst, const unsigned long *bitmap1, 94c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru const unsigned long *bitmap2, int bits); 95c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void __bitmap_or(unsigned long *dst, const unsigned long *bitmap1, 96c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru const unsigned long *bitmap2, int bits); 97c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void __bitmap_xor(unsigned long *dst, const unsigned long *bitmap1, 98c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru const unsigned long *bitmap2, int bits); 99c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void __bitmap_andnot(unsigned long *dst, const unsigned long *bitmap1, 100c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru const unsigned long *bitmap2, int bits); 101c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern int __bitmap_intersects(const unsigned long *bitmap1, 102c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru const unsigned long *bitmap2, int bits); 103c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern int __bitmap_subset(const unsigned long *bitmap1, 104c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru const unsigned long *bitmap2, int bits); 105c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern int __bitmap_weight(const unsigned long *bitmap, int bits); 106c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 107c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern int bitmap_scnprintf(char *buf, unsigned int len, 108c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru const unsigned long *src, int nbits); 109c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern int bitmap_parse(const char __user *ubuf, unsigned int ulen, 110c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned long *dst, int nbits); 111c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern int bitmap_scnlistprintf(char *buf, unsigned int len, 112c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru const unsigned long *src, int nbits); 113c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern int bitmap_parselist(const char *buf, unsigned long *maskp, 114c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru int nmaskbits); 115c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void bitmap_remap(unsigned long *dst, const unsigned long *src, 116c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru const unsigned long *old, const unsigned long *new, int bits); 117c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern int bitmap_bitremap(int oldbit, 118c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru const unsigned long *old, const unsigned long *new, int bits); 119c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern int bitmap_find_free_region(unsigned long *bitmap, int bits, int order); 120c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void bitmap_release_region(unsigned long *bitmap, int pos, int order); 121c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern int bitmap_allocate_region(unsigned long *bitmap, int pos, int order); 122c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 123c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define BITMAP_LAST_WORD_MASK(nbits) \ 124c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru( \ 125c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru ((nbits) % BITS_PER_LONG) ? \ 126c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru (1UL<<((nbits) % BITS_PER_LONG))-1 : ~0UL \ 127c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru) 128c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 129c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline void bitmap_zero(unsigned long *dst, int nbits) 130c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{ 131c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru if (nbits <= BITS_PER_LONG) 132c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru *dst = 0UL; 133c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru else { 134c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru int len = BITS_TO_LONGS(nbits) * sizeof(unsigned long); 135c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru memset(dst, 0, len); 136c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru } 137c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} 138c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 139c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline void bitmap_fill(unsigned long *dst, int nbits) 140c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{ 141c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru size_t nlongs = BITS_TO_LONGS(nbits); 142c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru if (nlongs > 1) { 143c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru int len = (nlongs - 1) * sizeof(unsigned long); 144c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru memset(dst, 0xff, len); 145c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru } 146c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru dst[nlongs - 1] = BITMAP_LAST_WORD_MASK(nbits); 147c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} 148c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 149c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline void bitmap_copy(unsigned long *dst, const unsigned long *src, 150c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru int nbits) 151c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{ 152c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru if (nbits <= BITS_PER_LONG) 153c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru *dst = *src; 154c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru else { 155c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru int len = BITS_TO_LONGS(nbits) * sizeof(unsigned long); 156c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru memcpy(dst, src, len); 157c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru } 158c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} 159c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 160c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline void bitmap_and(unsigned long *dst, const unsigned long *src1, 161c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru const unsigned long *src2, int nbits) 162c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{ 163c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru if (nbits <= BITS_PER_LONG) 164c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru *dst = *src1 & *src2; 165c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru else 166c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru __bitmap_and(dst, src1, src2, nbits); 167c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} 168c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 169c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline void bitmap_or(unsigned long *dst, const unsigned long *src1, 170c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru const unsigned long *src2, int nbits) 171c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{ 172c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru if (nbits <= BITS_PER_LONG) 173c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru *dst = *src1 | *src2; 174c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru else 175c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru __bitmap_or(dst, src1, src2, nbits); 176c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} 177c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 178c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline void bitmap_xor(unsigned long *dst, const unsigned long *src1, 179c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru const unsigned long *src2, int nbits) 180c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{ 181c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru if (nbits <= BITS_PER_LONG) 182c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru *dst = *src1 ^ *src2; 183c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru else 184c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru __bitmap_xor(dst, src1, src2, nbits); 185c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} 186c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 187c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline void bitmap_andnot(unsigned long *dst, const unsigned long *src1, 188c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru const unsigned long *src2, int nbits) 189c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{ 190c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru if (nbits <= BITS_PER_LONG) 191c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru *dst = *src1 & ~(*src2); 192c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru else 193c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru __bitmap_andnot(dst, src1, src2, nbits); 194c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} 195c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 196c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline void bitmap_complement(unsigned long *dst, const unsigned long *src, 197c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru int nbits) 198c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{ 199c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru if (nbits <= BITS_PER_LONG) 200c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru *dst = ~(*src) & BITMAP_LAST_WORD_MASK(nbits); 201c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru else 202c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru __bitmap_complement(dst, src, nbits); 203c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} 204c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 205c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline int bitmap_equal(const unsigned long *src1, 206c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru const unsigned long *src2, int nbits) 207c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{ 208c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru if (nbits <= BITS_PER_LONG) 209c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru return ! ((*src1 ^ *src2) & BITMAP_LAST_WORD_MASK(nbits)); 210c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru else 211c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru return __bitmap_equal(src1, src2, nbits); 212c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} 213c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 214c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline int bitmap_intersects(const unsigned long *src1, 215c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru const unsigned long *src2, int nbits) 216c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{ 217c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru if (nbits <= BITS_PER_LONG) 218c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru return ((*src1 & *src2) & BITMAP_LAST_WORD_MASK(nbits)) != 0; 219c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru else 220c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru return __bitmap_intersects(src1, src2, nbits); 221c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} 222c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 223c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline int bitmap_subset(const unsigned long *src1, 224c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru const unsigned long *src2, int nbits) 225c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{ 226c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru if (nbits <= BITS_PER_LONG) 227c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru return ! ((*src1 & ~(*src2)) & BITMAP_LAST_WORD_MASK(nbits)); 228c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru else 229c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru return __bitmap_subset(src1, src2, nbits); 230c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} 231c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 232c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline int bitmap_empty(const unsigned long *src, int nbits) 233c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{ 234c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru if (nbits <= BITS_PER_LONG) 235c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru return ! (*src & BITMAP_LAST_WORD_MASK(nbits)); 236c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru else 237c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru return __bitmap_empty(src, nbits); 238c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} 239c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 240c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline int bitmap_full(const unsigned long *src, int nbits) 241c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{ 242c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru if (nbits <= BITS_PER_LONG) 243c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru return ! (~(*src) & BITMAP_LAST_WORD_MASK(nbits)); 244c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru else 245c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru return __bitmap_full(src, nbits); 246c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} 247c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 248c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline int bitmap_weight(const unsigned long *src, int nbits) 249c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{ 250c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru if (nbits <= BITS_PER_LONG) 251c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru return hweight_long(*src & BITMAP_LAST_WORD_MASK(nbits)); 252c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru return __bitmap_weight(src, nbits); 253c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} 254c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 255c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline void bitmap_shift_right(unsigned long *dst, 256c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru const unsigned long *src, int n, int nbits) 257c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{ 258c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru if (nbits <= BITS_PER_LONG) 259c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru *dst = *src >> n; 260c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru else 261c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru __bitmap_shift_right(dst, src, n, nbits); 262c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} 263c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 264c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline void bitmap_shift_left(unsigned long *dst, 265c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru const unsigned long *src, int n, int nbits) 266c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{ 267c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru if (nbits <= BITS_PER_LONG) 268c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru *dst = (*src << n) & BITMAP_LAST_WORD_MASK(nbits); 269c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru else 270c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru __bitmap_shift_left(dst, src, n, nbits); 271c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} 272c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 273c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#endif /* __ASSEMBLY__ */ 274c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 275c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#endif /* __LINUX_BITMAP_H */ 276