Line data Source code
1 : /* SPDX-License-Identifier: GPL-2.0 */ 2 : /* 3 : * Copyright (c) 2000,2002,2005 Silicon Graphics, Inc. 4 : * All Rights Reserved. 5 : */ 6 : #ifndef __XFS_BIT_H__ 7 : #define __XFS_BIT_H__ 8 : 9 : /* 10 : * XFS bit manipulation routines. 11 : */ 12 : 13 : /* 14 : * masks with n high/low bits set, 64-bit values 15 : */ 16 : static inline uint64_t xfs_mask64hi(int n) 17 : { 18 : return (uint64_t)-1 << (64 - (n)); 19 : } 20 12088223158 : static inline uint32_t xfs_mask32lo(int n) 21 : { 22 12088223158 : return ((uint32_t)1 << (n)) - 1; 23 : } 24 : static inline uint64_t xfs_mask64lo(int n) 25 : { 26 : return ((uint64_t)1 << (n)) - 1; 27 : } 28 : 29 : /* Get high bit set out of 32-bit argument, -1 if none set */ 30 : static inline int xfs_highbit32(uint32_t v) 31 : { 32 23132482 : return fls(v) - 1; 33 : } 34 : 35 : /* Get high bit set out of 64-bit argument, -1 if none set */ 36 : static inline int xfs_highbit64(uint64_t v) 37 : { 38 25202890 : return fls64(v) - 1; 39 : } 40 : 41 : /* Get low bit set out of 32-bit argument, -1 if none set */ 42 : static inline int xfs_lowbit32(uint32_t v) 43 : { 44 378668467 : return ffs(v) - 1; 45 : } 46 : 47 : /* Get low bit set out of 64-bit argument, -1 if none set */ 48 : static inline int xfs_lowbit64(uint64_t v) 49 : { 50 47345811 : uint32_t w = (uint32_t)v; 51 47345811 : int n = 0; 52 : 53 47345811 : if (w) { /* lower bits */ 54 24112824 : n = ffs(w); 55 : } else { /* upper bits */ 56 23232987 : w = (uint32_t)(v >> 32); 57 23232987 : if (w) { 58 23233005 : n = ffs(w); 59 23233005 : if (n) 60 23233005 : n += 32; 61 : } 62 : } 63 47345811 : return n - 1; 64 : } 65 : 66 : /* Return whether bitmap is empty (1 == empty) */ 67 : extern int xfs_bitmap_empty(uint *map, uint size); 68 : 69 : /* Count continuous one bits in map starting with start_bit */ 70 : extern int xfs_contig_bits(uint *map, uint size, uint start_bit); 71 : 72 : /* Find next set bit in map */ 73 : extern int xfs_next_bit(uint *map, uint size, uint start_bit); 74 : 75 : #endif /* __XFS_BIT_H__ */