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 3349293865 : xfs_bitmap_empty(uint *map, uint size) 21 : { 22 3349293865 : uint i; 23 : 24 3432747561 : for (i = 0; i < size; i++) { 25 3374648685 : 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 8647559558 : xfs_contig_bits(uint *map, uint size, uint start_bit) 38 : { 39 8647559558 : uint * p = ((unsigned int *) map) + (start_bit >> BIT_TO_WORD_SHIFT); 40 8647559558 : uint result = 0; 41 8647559558 : uint tmp; 42 : 43 8647559558 : size <<= BIT_TO_WORD_SHIFT; 44 : 45 8647559558 : ASSERT(start_bit < size); 46 8647559558 : size -= start_bit & ~(NBWORD - 1); 47 8647559558 : start_bit &= (NBWORD - 1); 48 8647559558 : if (start_bit) { 49 3389453070 : tmp = *p++; 50 : /* set to one first offset bits prior to start */ 51 3389453070 : tmp |= (~0U >> (NBWORD-start_bit)); 52 3389453070 : if (tmp != ~0U) 53 3055671322 : goto found; 54 333781748 : result += NBWORD; 55 333781748 : size -= NBWORD; 56 : } 57 7229467469 : while (size) { 58 5277045695 : if ((tmp = *p++) != ~0U) 59 3639466462 : goto found; 60 1637579233 : result += NBWORD; 61 1637579233 : size -= NBWORD; 62 : } 63 1952421774 : return result - start_bit; 64 6695137784 : found: 65 6695137784 : 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 66888886535 : int xfs_next_bit(uint *map, uint size, uint start_bit) 77 : { 78 66888886535 : uint * p = ((unsigned int *) map) + (start_bit >> BIT_TO_WORD_SHIFT); 79 66888886535 : uint result = start_bit & ~(NBWORD - 1); 80 66888886535 : uint tmp; 81 : 82 66888886535 : size <<= BIT_TO_WORD_SHIFT; 83 : 84 66888886535 : if (start_bit >= size) 85 : return -1; 86 64783481092 : size -= result; 87 64783481092 : start_bit &= (NBWORD - 1); 88 64783481092 : if (start_bit) { 89 53492857297 : tmp = *p++; 90 : /* set to zero first offset bits prior to start */ 91 53492857297 : tmp &= (~0U << start_bit); 92 53492857297 : if (tmp != 0U) 93 44046297281 : goto found; 94 9446560016 : result += NBWORD; 95 9446560016 : size -= NBWORD; 96 : } 97 20863990134 : while (size) { 98 11607642050 : if ((tmp = *p++) != 0U) 99 11480835727 : goto found; 100 126806323 : result += NBWORD; 101 126806323 : size -= NBWORD; 102 : } 103 : return -1; 104 55527133008 : found: 105 55527133008 : return result + ffs(tmp) - 1; 106 : }