/*
 *	dmem.h -- dynamic memory allocator (MIPS specific stuffs)
 *	Copyright (C) 2000 Fred Barnes <frmb2@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)
{
	int res;

	/* do this in C for now -- worry about how MIPS really does it later.. */
	if (!v) {
		return 32;
	}
	res = 0;
	while (!(v & 0x00000001)) {
		v >>= 1;
		res++;
	}
#if 0
	__asm__ __volatile__ ("		\n" \
		"	bsr	%1,%0	\n" \
		: "=r" (res) : "r" (v) : "cc");
#endif
	return res;
}


/* 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	/* !__DMEM_H */

