Line data Source code
1 : // SPDX-License-Identifier: GPL-2.0 2 : /* 3 : * Copyright (c) 2000-2005 Silicon Graphics, Inc. 4 : * All Rights Reserved. 5 : */ 6 : #include "xfs.h" 7 : #include "xfs_log_format.h" 8 : #include "xfs_bit.h" 9 : 10 : /* 11 : * XFS bit manipulation routines, used in non-realtime code. 12 : */ 13 : 14 : /* 15 : * Return whether bitmap is empty. 16 : * Size is number of words in the bitmap, which is padded to word boundary 17 : * Returns 1 for empty, 0 for non-empty. 18 : */ 19 : int 20 2538099831 : xfs_bitmap_empty(uint *map, uint size) 21 : { 22 2538099831 : uint i; 23 : 24 2622593652 : for (i = 0; i < size; i++) { 25 2550857358 : if (map[i] != 0) 26 : return 0; 27 : } 28 : 29 : return 1; 30 : } 31 : 32 : /* 33 : * Count the number of contiguous bits set in the bitmap starting with bit 34 : * start_bit. Size is the size of the bitmap in words. 35 : */ 36 : int 37 7087320922 : xfs_contig_bits(uint *map, uint size, uint start_bit) 38 : { 39 7087320922 : uint * p = ((unsigned int *) map) + (start_bit >> BIT_TO_WORD_SHIFT); 40 7087320922 : uint result = 0; 41 7087320922 : uint tmp; 42 : 43 7087320922 : size <<= BIT_TO_WORD_SHIFT; 44 : 45 7087320922 : ASSERT(start_bit < size); 46 7087320922 : size -= start_bit & ~(NBWORD - 1); 47 7087320922 : start_bit &= (NBWORD - 1); 48 7087320922 : if (start_bit) { 49 2847685490 : tmp = *p++; 50 : /* set to one first offset bits prior to start */ 51 2847685490 : tmp |= (~0U >> (NBWORD-start_bit)); 52 2847685490 : if (tmp != ~0U) 53 2495553473 : goto found; 54 352132017 : result += NBWORD; 55 352132017 : size -= NBWORD; 56 : } 57 5918405106 : while (size) { 58 4408918952 : if ((tmp = *p++) != ~0U) 59 3082281295 : goto found; 60 1326637657 : result += NBWORD; 61 1326637657 : size -= NBWORD; 62 : } 63 1509486154 : return result - start_bit; 64 5577834768 : found: 65 5577834768 : return result + ffz(tmp) - start_bit; 66 : } 67 : 68 : /* 69 : * This takes the bit number to start looking from and 70 : * returns the next set bit from there. It returns -1 71 : * if there are no more bits set or the start bit is 72 : * beyond the end of the bitmap. 73 : * 74 : * Size is the number of words, not bytes, in the bitmap. 75 : */ 76 84875373133 : int xfs_next_bit(uint *map, uint size, uint start_bit) 77 : { 78 84875373133 : uint * p = ((unsigned int *) map) + (start_bit >> BIT_TO_WORD_SHIFT); 79 84875373133 : uint result = start_bit & ~(NBWORD - 1); 80 84875373133 : uint tmp; 81 : 82 84875373133 : size <<= BIT_TO_WORD_SHIFT; 83 : 84 84875373133 : if (start_bit >= size) 85 : return -1; 86 83168420759 : size -= result; 87 83168420759 : start_bit &= (NBWORD - 1); 88 83168420759 : if (start_bit) { 89 70727122252 : tmp = *p++; 90 : /* set to zero first offset bits prior to start */ 91 70727122252 : tmp &= (~0U << start_bit); 92 70727122252 : if (tmp != 0U) 93 59838295194 : goto found; 94 10888827058 : result += NBWORD; 95 10888827058 : size -= NBWORD; 96 : } 97 23479988226 : while (size) { 98 12717479345 : if ((tmp = *p++) != 0U) 99 12567616684 : goto found; 100 149862661 : result += NBWORD; 101 149862661 : size -= NBWORD; 102 : } 103 : return -1; 104 72405911878 : found: 105 72405911878 : return result + ffs(tmp) - 1; 106 : }