linux/arch/arm/nwfpe/fpmodule.inl
<<
>>
Prefs
   1/*
   2    NetWinder Floating Point Emulator
   3    (c) Rebel.COM, 1998,1999
   4
   5    Direct questions, comments to Scott Bambrough <scottb@netwinder.org>
   6
   7    This program is free software; you can redistribute it and/or modify
   8    it under the terms of the GNU General Public License as published by
   9    the Free Software Foundation; either version 2 of the License, or
  10    (at your option) any later version.
  11
  12    This program is distributed in the hope that it will be useful,
  13    but WITHOUT ANY WARRANTY; without even the implied warranty of
  14    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  15    GNU General Public License for more details.
  16
  17    You should have received a copy of the GNU General Public License
  18    along with this program; if not, write to the Free Software
  19    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  20*/
  21
  22static inline unsigned long readRegister(const unsigned int nReg)
  23{
  24        /* Note: The CPU thinks it has dealt with the current instruction.
  25           As a result the program counter has been advanced to the next
  26           instruction, and points 4 bytes beyond the actual instruction
  27           that caused the invalid instruction trap to occur.  We adjust
  28           for this in this routine.  LDF/STF instructions with Rn = PC
  29           depend on the PC being correct, as they use PC+8 in their
  30           address calculations. */
  31        struct pt_regs *regs = GET_USERREG();
  32        unsigned int val = regs->uregs[nReg];
  33        if (REG_PC == nReg)
  34                val -= 4;
  35        return val;
  36}
  37
  38static inline void
  39writeRegister(const unsigned int nReg, const unsigned long val)
  40{
  41        struct pt_regs *regs = GET_USERREG();
  42        regs->uregs[nReg] = val;
  43}
  44
  45static inline unsigned long readCPSR(void)
  46{
  47        return (readRegister(REG_CPSR));
  48}
  49
  50static inline void writeCPSR(const unsigned long val)
  51{
  52        writeRegister(REG_CPSR, val);
  53}
  54
  55static inline unsigned long readConditionCodes(void)
  56{
  57#ifdef __FPEM_TEST__
  58        return (0);
  59#else
  60        return (readCPSR() & CC_MASK);
  61#endif
  62}
  63
  64static inline void writeConditionCodes(const unsigned long val)
  65{
  66        struct pt_regs *regs = GET_USERREG();
  67        unsigned long rval;
  68        /*
  69         * Operate directly on userRegisters since
  70         * the CPSR may be the PC register itself.
  71         */
  72        rval = regs->ARM_cpsr & ~CC_MASK;
  73        regs->ARM_cpsr = rval | (val & CC_MASK);
  74}
  75