Rev 424 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed
#ifndef INCLUDED_tlsfbits#define INCLUDED_tlsfbits#include "../../global.h"#if defined(__cplusplus)#define tlsf_decl inline#else#define tlsf_decl static#endif/*** Architecture-specific bit manipulation routines.**** TLSF achieves O(1) cost for malloc and free operations by limiting** the search for a free block to a free list of guaranteed size** adequate to fulfill the request, combined with efficient free list** queries using bitmasks and architecture-specific bit-manipulation** routines.**** Most modern processors provide instructions to count leading zeroes** in a word, find the lowest and highest set bit, etc. These** specific implementations will be used when available, falling back** to a reasonably efficient generic implementation.**** NOTE: TLSF spec relies on ffs/fls returning value 0..31.** ffs/fls return 1-32 by default, returning 0 for error.*//*** gcc 3.4 and above have builtin support, specialized for architecture.** Some compilers masquerade as gcc; patchlevel test filters them out.*/tlsf_decl int tlsf_fls_generic(unsigned int word) ICODE_ATTR;tlsf_decl int tlsf_fls_generic(unsigned int word){int bit = 32;if (!word) bit -= 1;if (!(word & 0xffff0000)) { word <<= 16; bit -= 16; }if (!(word & 0xff000000)) { word <<= 8; bit -= 8; }if (!(word & 0xf0000000)) { word <<= 4; bit -= 4; }if (!(word & 0xc0000000)) { word <<= 2; bit -= 2; }if (!(word & 0x80000000)) { word <<= 1; bit -= 1; }return bit;}/* Implement ffs in terms of fls. */tlsf_decl int tlsf_ffs(unsigned int word) ICODE_ATTR;tlsf_decl int tlsf_ffs(unsigned int word){return tlsf_fls_generic(word & (~word + 1)) - 1;}tlsf_decl int tlsf_fls(unsigned int word) ICODE_ATTR;tlsf_decl int tlsf_fls(unsigned int word){return tlsf_fls_generic(word) - 1;}#undef tlsf_decl#endif