/*
    NetWinder Floating Point Emulator
    (c) Rebel.COM, 1998,1999

    Direct questions, comments to Scott Bambrough <scottb@netwinder.org>

    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.
*/

#include "fpa11.h"

/* Read and write floating point status register */
static inline unsigned int readFPSR(void)
{
	FPA11 *fpa11 = GET_FPA11();
	return (fpa11->fpsr);
}

static inline void writeFPSR(FPSR reg)
{
	FPA11 *fpa11 = GET_FPA11();
	/* the sysid byte in the status register is readonly */
	fpa11->fpsr = (fpa11->fpsr & MASK_SYSID) | (reg & ~MASK_SYSID);
}

/* Read and write floating point control register */
static inline FPCR readFPCR(void)
{
	FPA11 *fpa11 = GET_FPA11();
	/* clear SB, AB and DA bits before returning FPCR */
	return (fpa11->fpcr & ~MASK_RFC);
}

static inline void writeFPCR(FPCR reg)
{
	FPA11 *fpa11 = GET_FPA11();
	fpa11->fpcr &= ~MASK_WFC;		/* clear SB, AB and DA bits */
	fpa11->fpcr |= (reg & MASK_WFC);	/* write SB, AB and DA bits */
}
