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 2192692255 : xfs_bitmap_empty(uint *map, uint size) 21 : { 22 2192692255 : uint i; 23 : 24 2271793265 : for (i = 0; i < size; i++) { 25 2206643357 : 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 5302608773 : xfs_contig_bits(uint *map, uint size, uint start_bit) 38 : { 39 5302608773 : uint * p = ((unsigned int *) map) + (start_bit >> BIT_TO_WORD_SHIFT); 40 5302608773 : uint result = 0; 41 5302608773 : uint tmp; 42 : 43 5302608773 : size <<= BIT_TO_WORD_SHIFT; 44 : 45 5302608773 : ASSERT(start_bit < size); 46 5302608773 : size -= start_bit & ~(NBWORD - 1); 47 5302608773 : start_bit &= (NBWORD - 1); 48 5302608773 : if (start_bit) { 49 1828445635 : tmp = *p++; 50 : /* set to one first offset bits prior to start */ 51 1828445635 : tmp |= (~0U >> (NBWORD-start_bit)); 52 1828445635 : if (tmp != ~0U) 53 1603637079 : goto found; 54 224808556 : result += NBWORD; 55 224808556 : size -= NBWORD; 56 : } 57 4762202640 : while (size) { 58 3643353309 : if ((tmp = *p++) != ~0U) 59 2580122363 : goto found; 60 1063230946 : result += NBWORD; 61 1063230946 : size -= NBWORD; 62 : } 63 1118849331 : return result - start_bit; 64 4183759442 : found: 65 4183759442 : 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 76347813730 : int xfs_next_bit(uint *map, uint size, uint start_bit) 77 : { 78 76347813730 : uint * p = ((unsigned int *) map) + (start_bit >> BIT_TO_WORD_SHIFT); 79 76347813730 : uint result = start_bit & ~(NBWORD - 1); 80 76347813730 : uint tmp; 81 : 82 76347813730 : size <<= BIT_TO_WORD_SHIFT; 83 : 84 76347813730 : if (start_bit >= size) 85 : return -1; 86 75118220094 : size -= result; 87 75118220094 : start_bit &= (NBWORD - 1); 88 75118220094 : if (start_bit) { 89 64143744277 : tmp = *p++; 90 : /* set to zero first offset bits prior to start */ 91 64143744277 : tmp &= (~0U << start_bit); 92 64143744277 : if (tmp != 0U) 93 54230504829 : goto found; 94 9913239448 : result += NBWORD; 95 9913239448 : size -= NBWORD; 96 : } 97 21030677848 : while (size) { 98 11265763638 : if ((tmp = *p++) != 0U) 99 11122801055 : goto found; 100 142962583 : result += NBWORD; 101 142962583 : size -= NBWORD; 102 : } 103 : return -1; 104 65353305884 : found: 105 65353305884 : return result + ffs(tmp) - 1; 106 : }