mirror of
https://github.com/jart/cosmopolitan.git
synced 2025-01-31 03:27:39 +00:00
fa20edc44d
- Remove most __ASSEMBLER__ __LINKER__ ifdefs - Rename libc/intrin/bits.h to libc/serialize.h - Block pthread cancelation in fchmodat() polyfill - Remove `clang-format off` statements in third_party
66 lines
1.7 KiB
C++
66 lines
1.7 KiB
C++
|
|
/* ------------------------ Operations on bin maps ----------------------- */
|
|
|
|
/* bit corresponding to given index */
|
|
#define idx2bit(i) ((binmap_t)(1) << (i))
|
|
|
|
/* Mark/Clear bits with given index */
|
|
#define mark_smallmap(M,i) ((M)->smallmap |= idx2bit(i))
|
|
#define clear_smallmap(M,i) ((M)->smallmap &= ~idx2bit(i))
|
|
#define smallmap_is_marked(M,i) ((M)->smallmap & idx2bit(i))
|
|
|
|
#define mark_treemap(M,i) ((M)->treemap |= idx2bit(i))
|
|
#define clear_treemap(M,i) ((M)->treemap &= ~idx2bit(i))
|
|
#define treemap_is_marked(M,i) ((M)->treemap & idx2bit(i))
|
|
|
|
/* isolate the least set bit of a bitmap */
|
|
#define least_bit(x) ((x) & -(x))
|
|
|
|
/* mask with all bits to left of least bit of x on */
|
|
#define left_bits(x) ((x<<1) | -(x<<1))
|
|
|
|
/* mask with all bits to left of or equal to least bit of x on */
|
|
#define same_or_left_bits(x) ((x) | -(x))
|
|
|
|
/* index corresponding to given bit. Use x86 asm if possible */
|
|
|
|
#ifdef __GNUC__
|
|
#define compute_bit2idx(X, I)\
|
|
{\
|
|
unsigned int J;\
|
|
J = __builtin_ctz(X); \
|
|
I = (bindex_t)J;\
|
|
}
|
|
|
|
#elif defined (__INTEL_COMPILER)
|
|
#define compute_bit2idx(X, I)\
|
|
{\
|
|
unsigned int J;\
|
|
J = _bit_scan_forward (X); \
|
|
I = (bindex_t)J;\
|
|
}
|
|
|
|
#elif defined(_MSC_VER) && _MSC_VER>=1300
|
|
#define compute_bit2idx(X, I)\
|
|
{\
|
|
unsigned int J;\
|
|
_BitScanForward((DWORD *) &J, X);\
|
|
I = (bindex_t)J;\
|
|
}
|
|
|
|
#elif USE_BUILTIN_FFS
|
|
#define compute_bit2idx(X, I) I = ffs(X)-1
|
|
|
|
#else
|
|
#define compute_bit2idx(X, I)\
|
|
{\
|
|
unsigned int Y = X - 1;\
|
|
unsigned int K = Y >> (16-4) & 16;\
|
|
unsigned int N = K; Y >>= K;\
|
|
N += K = Y >> (8-3) & 8; Y >>= K;\
|
|
N += K = Y >> (4-2) & 4; Y >>= K;\
|
|
N += K = Y >> (2-1) & 2; Y >>= K;\
|
|
N += K = Y >> (1-0) & 1; Y >>= K;\
|
|
I = (bindex_t)(N + Y);\
|
|
}
|
|
#endif /* GNUC */
|