* armemu.h (GETSPSR): Call ARMul_GetSPSR().
authorAlexandre Oliva <aoliva@redhat.com>
Tue, 4 Jul 2000 06:19:29 +0000 (06:19 +0000)
committerAlexandre Oliva <aoliva@redhat.com>
Tue, 4 Jul 2000 06:19:29 +0000 (06:19 +0000)
* armsupp.c (ARMul_CPSRAltered): Zero out bits as they're
extracted from state->Cpsr, but preserve the unused bits.
(ARMul_GetCPSR): Get bits preserved in state->Cpsr.
(ARMul_GetSPSR, ARMul_FixCPSR): Use ARMul_GetCPSR() to
get the full CPSR word.

sim/arm/ChangeLog
sim/arm/armemu.h
sim/arm/armsupp.c

index e401eef..1b3a557 100644 (file)
@@ -1,5 +1,12 @@
 2000-07-04  Alexandre Oliva  <aoliva@redhat.com>
 
+       * armemu.h (GETSPSR): Call ARMul_GetSPSR().
+       * armsupp.c (ARMul_CPSRAltered): Zero out bits as they're
+       extracted from state->Cpsr, but preserve the unused bits.
+       (ARMul_GetCPSR): Get bits preserved in state->Cpsr.
+       (ARMul_GetSPSR, ARMul_FixCPSR): Use ARMul_GetCPSR() to
+       get the full CPSR word.
+
        * armemu.h (PSR_FBITS, PSR_SBITS, PSR_XBITS, PSR_CBITS): New.
        (SETPSR_F, SETPSR_S, SETPSR_X, SETPSR_C): New macros.
        (SETPSR, SET_INTMODE, SETCC): Removed.
index 5e832f2..da7fb2b 100644 (file)
@@ -163,7 +163,7 @@ extern ARMword isize;
 #define PATCHR15 state->Reg[15] = ECC | ER15INT | EMODE | R15PC
 #endif
 
-#define GETSPSR(bank) bank>0?state->Spsr[bank]:ECC | EINT | EMODE ;
+#define GETSPSR(bank) (ARMul_GetSPSR (state, EMODE))
 #define SETPSR_F(d,s) d = ((d) & ~PSR_FBITS) | ((s) & PSR_FBITS)
 #define SETPSR_S(d,s) d = ((d) & ~PSR_SBITS) | ((s) & PSR_SBITS)
 #define SETPSR_X(d,s) d = ((d) & ~PSR_XBITS) | ((s) & PSR_XBITS)
index 6930529..27ee35b 100644 (file)
@@ -183,7 +183,7 @@ ARMul_SetR15 (ARMul_State * state, ARMword value)
 ARMword
 ARMul_GetCPSR (ARMul_State * state)
 {
-  return (CPSR);
+  return (CPSR | state->Cpsr);
 }
 
 /***************************************************************************\
@@ -205,7 +205,7 @@ ARMul_SetCPSR (ARMul_State * state, ARMword value)
 void
 ARMul_FixCPSR (ARMul_State * state, ARMword instr, ARMword rhs)
 {
-  state->Cpsr = CPSR;
+  state->Cpsr = ARMul_GetCPSR (state);
   if (state->Bank != USERBANK)
     {                          /* In user mode, only write flags */
       if (BIT (16))
@@ -230,7 +230,7 @@ ARMul_GetSPSR (ARMul_State * state, ARMword mode)
   ARMword bank = ModeToBank (mode & MODEBITS);
 
   if (! BANK_CAN_ACCESS_SPSR (bank))
-    return CPSR;
+    return ARMul_GetCPSR (state);
 
   return state->Spsr[bank];
 }
@@ -290,14 +290,21 @@ ARMul_CPSRAltered (ARMul_State * state)
       
       state->NtransSig = (state->Mode & 3) ? HIGH : LOW;
     }
+  state->Cpsr &= ~MODEBITS;
 
   ASSIGNINT (state->Cpsr & INTBITS);
+  state->Cpsr &= ~INTBITS;
   ASSIGNN ((state->Cpsr & NBIT) != 0);
+  state->Cpsr &= ~NBIT;
   ASSIGNZ ((state->Cpsr & ZBIT) != 0);
+  state->Cpsr &= ~ZBIT;
   ASSIGNC ((state->Cpsr & CBIT) != 0);
+  state->Cpsr &= ~CBIT;
   ASSIGNV ((state->Cpsr & VBIT) != 0);
+  state->Cpsr &= ~VBIT;
 #ifdef MODET
   ASSIGNT ((state->Cpsr & TBIT) != 0);
+  state->Cpsr &= ~TBIT;
 #endif
 
   if (oldmode > SVC26MODE)