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