Subversion Repositories freemyipod

Rev

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