mirror of
https://github.com/jart/cosmopolitan.git
synced 2025-01-31 19:43:32 +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
90 lines
2.7 KiB
C++
90 lines
2.7 KiB
C++
|
|
/* ---------------------------- Indexing Bins ---------------------------- */
|
|
|
|
#define is_small(s) (((s) >> SMALLBIN_SHIFT) < NSMALLBINS)
|
|
#define small_index(s) (bindex_t)((s) >> SMALLBIN_SHIFT)
|
|
#define small_index2size(i) ((i) << SMALLBIN_SHIFT)
|
|
#define MIN_SMALL_INDEX (small_index(MIN_CHUNK_SIZE))
|
|
|
|
/* addressing by index. See above about smallbin repositioning */
|
|
#define smallbin_at(M, i) ((sbinptr)((char*)&((M)->smallbins[(i)<<1])))
|
|
#define treebin_at(M,i) (&((M)->treebins[i]))
|
|
|
|
/* assign tree index for size S to variable I. Use x86 asm if possible */
|
|
#if defined(__GNUC__) && (defined(__i386__) || defined(__x86_64__))
|
|
#define compute_tree_index(S, I)\
|
|
{\
|
|
unsigned int X = S >> TREEBIN_SHIFT;\
|
|
if (X == 0)\
|
|
I = 0;\
|
|
else if (X > 0xFFFF)\
|
|
I = NTREEBINS-1;\
|
|
else {\
|
|
unsigned int K = (unsigned) sizeof(X)*__CHAR_BIT__ - 1 - (unsigned) __builtin_clz(X); \
|
|
I = (bindex_t)((K << 1) + ((S >> (K + (TREEBIN_SHIFT-1)) & 1)));\
|
|
}\
|
|
}
|
|
|
|
#elif defined (__INTEL_COMPILER)
|
|
#define compute_tree_index(S, I)\
|
|
{\
|
|
size_t X = S >> TREEBIN_SHIFT;\
|
|
if (X == 0)\
|
|
I = 0;\
|
|
else if (X > 0xFFFF)\
|
|
I = NTREEBINS-1;\
|
|
else {\
|
|
unsigned int K = _bit_scan_reverse (X); \
|
|
I = (bindex_t)((K << 1) + ((S >> (K + (TREEBIN_SHIFT-1)) & 1)));\
|
|
}\
|
|
}
|
|
|
|
#elif defined(_MSC_VER) && _MSC_VER>=1300
|
|
#define compute_tree_index(S, I)\
|
|
{\
|
|
size_t X = S >> TREEBIN_SHIFT;\
|
|
if (X == 0)\
|
|
I = 0;\
|
|
else if (X > 0xFFFF)\
|
|
I = NTREEBINS-1;\
|
|
else {\
|
|
unsigned int K;\
|
|
_BitScanReverse((DWORD *) &K, (DWORD) X);\
|
|
I = (bindex_t)((K << 1) + ((S >> (K + (TREEBIN_SHIFT-1)) & 1)));\
|
|
}\
|
|
}
|
|
|
|
#else /* GNUC */
|
|
#define compute_tree_index(S, I)\
|
|
{\
|
|
size_t X = S >> TREEBIN_SHIFT;\
|
|
if (X == 0)\
|
|
I = 0;\
|
|
else if (X > 0xFFFF)\
|
|
I = NTREEBINS-1;\
|
|
else {\
|
|
unsigned int Y = (unsigned int)X;\
|
|
unsigned int N = ((Y - 0x100) >> 16) & 8;\
|
|
unsigned int K = (((Y <<= N) - 0x1000) >> 16) & 4;\
|
|
N += K;\
|
|
N += K = (((Y <<= K) - 0x4000) >> 16) & 2;\
|
|
K = 14 - N + ((Y <<= K) >> 15);\
|
|
I = (K << 1) + ((S >> (K + (TREEBIN_SHIFT-1)) & 1));\
|
|
}\
|
|
}
|
|
#endif /* GNUC */
|
|
|
|
/* Bit representing maximum resolved size in a treebin at i */
|
|
#define bit_for_tree_index(i) \
|
|
(i == NTREEBINS-1)? (SIZE_T_BITSIZE-1) : (((i) >> 1) + TREEBIN_SHIFT - 2)
|
|
|
|
/* Shift placing maximum resolved bit in a treebin at i as sign bit */
|
|
#define leftshift_for_tree_index(i) \
|
|
((i == NTREEBINS-1)? 0 : \
|
|
((SIZE_T_BITSIZE-SIZE_T_ONE) - (((i) >> 1) + TREEBIN_SHIFT - 2)))
|
|
|
|
/* The size of the smallest chunk held in bin with index i */
|
|
#define minsize_for_tree_index(i) \
|
|
((SIZE_T_ONE << (((i) >> 1) + TREEBIN_SHIFT)) | \
|
|
(((size_t)((i) & SIZE_T_ONE)) << (((i) >> 1) + TREEBIN_SHIFT - 1)))
|
|
|