76 lines · c
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 values15 */16static inline uint64_t xfs_mask64hi(int n)17{18 return (uint64_t)-1 << (64 - (n));19}20static inline uint32_t xfs_mask32lo(int n)21{22 return ((uint32_t)1 << (n)) - 1;23}24static 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 */30static inline int xfs_highbit32(uint32_t v)31{32 return fls(v) - 1;33}34 35/* Get high bit set out of 64-bit argument, -1 if none set */36static inline int xfs_highbit64(uint64_t v)37{38 return fls64(v) - 1;39}40 41/* Get low bit set out of 32-bit argument, -1 if none set */42static inline int xfs_lowbit32(uint32_t v)43{44 return ffs(v) - 1;45}46 47/* Get low bit set out of 64-bit argument, -1 if none set */48static inline int xfs_lowbit64(uint64_t v)49{50 uint32_t w = (uint32_t)v;51 int n = 0;52 53 if (w) { /* lower bits */54 n = ffs(w);55 } else { /* upper bits */56 w = (uint32_t)(v >> 32);57 if (w) {58 n = ffs(w);59 if (n)60 n += 32;61 }62 }63 return n - 1;64}65 66/* Return whether bitmap is empty (1 == empty) */67extern int xfs_bitmap_empty(uint *map, uint size);68 69/* Count continuous one bits in map starting with start_bit */70extern int xfs_contig_bits(uint *map, uint size, uint start_bit);71 72/* Find next set bit in map */73extern int xfs_next_bit(uint *map, uint size, uint start_bit);74 75#endif /* __XFS_BIT_H__ */76