/*
 *	dmem.h -- dynamic memory allocator (i386 specific stuffs)
 *	Copyright (C) 2000-2004 Fred Barnes <frmb@ukc.ac.uk>
 *	Based on Per Brinch Hansen's parallel allocator as adapted by David Wood
 *
 *	This program is free software; you can redistribute it and/or modify
 *	it under the terms of the GNU General Public License as published by
 *	the Free Software Foundation; either version 2 of the License, or
 *	(at your option) any later version.
 *
 *	This program is distributed in the hope that it will be useful,
 *	but WITHOUT ANY WARRANTY; without even the implied warranty of
 *	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *	GNU General Public License for more details.
 *
 *	You should have received a copy of the GNU General Public License
 *	along with this program; if not, write to the Free Software
 *	Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 */

#ifndef __DMEM_H
#define __DMEM_H


static inline int bsr (int v)
{
	unsigned int res;
	int i;

	for (i = 31, res = (1 << 31); i; i--, res >>= 1) {
		if (v & res) {
			return i;
		}
	}
	return 0;
}

/* tidied these up a bit now */
#define SlotToSize(N)		(2 << (((N) >> 1) + 2)) + (((N) & 1) ? (2 << (((N) >> 1) + 1)) : 0)
#define SizeToSlot(X)		((X) < 11) ? 1 : (((bsr((X) - 1) - 2) << 1)) - (((X) < (3 << (bsr((X) - 1) - 1))) ? 1 : 0)

#if 0
/* OLD VERSIONS */

/* these are unpleaseant, but the compiler will tidy up */
static inline int SlotToSize (int p)
{
	int s;

	s = (4 << (p >> 1));
	if (p & 1) {
		s += (2 << (p >> 1));
	}
	return s;
}

static inline int SizeToSlot (int s)
{
	int p;

	if (s <= 4) {
		return 0;
	}
	p = ((bsr(s) - 2) << 1);
	while (s > SlotToSize (p)) {
		p++;
	}
	return p;
}
#endif


#endif	/* !__DMEM_H */

