/*
    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, see <http://www.gnu.org/licenses/>.
*/

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