* elf32-vax.c (elf_vax_relocate_section)
[deliverable/binutils-gdb.git] / sim / arm / armemu.c
index ebc6aed1f6da38b5ebdc3e3c07903eb5518f5bcb..558e897582aec5da0418aa0e87756d73d4be0eaf 100644 (file)
  
     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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
+    Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.  */
 
 #include "armdefs.h"
 #include "armemu.h"
 #include "armos.h"
+#include "iwmmxt.h"
 
 static ARMword  GetDPRegRHS         (ARMul_State *, ARMword);
 static ARMword  GetDPSRegRHS        (ARMul_State *, ARMword);
@@ -55,7 +56,7 @@ static void     Handle_Store_Double (ARMul_State *, ARMword);
 static long ui_loop_hook_counter = UI_LOOP_POLL_INTERVAL;
 
 /* Actual hook to call to run through gdb's gui event loop.  */
-extern int (*ui_loop_hook) (int);
+extern int (*deprecated_ui_loop_hook) (int);
 #endif /* NEED_UI_LOOP_HOOK */
 
 extern int stop_simulator;
@@ -268,6 +269,211 @@ extern int stop_simulator;
      break;                                                            \
 }
 
+/* Attempt to emulate an ARMv6 instruction.
+   Returns non-zero upon success.  */
+
+static int
+handle_v6_insn (ARMul_State * state, ARMword instr)
+{
+  switch (BITS (20, 27))
+    {
+#if 0
+    case 0x03: printf ("Unhandled v6 insn: ldr\n"); break;
+    case 0x04: printf ("Unhandled v6 insn: umaal\n"); break;
+    case 0x06: printf ("Unhandled v6 insn: mls/str\n"); break;
+    case 0x16: printf ("Unhandled v6 insn: smi\n"); break;
+    case 0x18: printf ("Unhandled v6 insn: strex\n"); break;
+    case 0x19: printf ("Unhandled v6 insn: ldrex\n"); break;
+    case 0x1a: printf ("Unhandled v6 insn: strexd\n"); break;
+    case 0x1b: printf ("Unhandled v6 insn: ldrexd\n"); break;
+    case 0x1c: printf ("Unhandled v6 insn: strexb\n"); break;
+    case 0x1d: printf ("Unhandled v6 insn: ldrexb\n"); break;
+    case 0x1e: printf ("Unhandled v6 insn: strexh\n"); break;
+    case 0x1f: printf ("Unhandled v6 insn: ldrexh\n"); break;
+    case 0x30: printf ("Unhandled v6 insn: movw\n"); break;
+    case 0x32: printf ("Unhandled v6 insn: nop/sev/wfe/wfi/yield\n"); break;
+    case 0x34: printf ("Unhandled v6 insn: movt\n"); break;
+    case 0x3f: printf ("Unhandled v6 insn: rbit\n"); break;
+#endif
+    case 0x61: printf ("Unhandled v6 insn: sadd/ssub\n"); break;
+    case 0x62: printf ("Unhandled v6 insn: qadd/qsub\n"); break;
+    case 0x63: printf ("Unhandled v6 insn: shadd/shsub\n"); break;
+    case 0x65: printf ("Unhandled v6 insn: uadd/usub\n"); break;
+    case 0x66: printf ("Unhandled v6 insn: uqadd/uqsub\n"); break;
+    case 0x67: printf ("Unhandled v6 insn: uhadd/uhsub\n"); break;
+    case 0x68: printf ("Unhandled v6 insn: pkh/sxtab/selsxtb\n"); break;
+    case 0x6c: printf ("Unhandled v6 insn: uxtb16/uxtab16\n"); break;
+    case 0x70: printf ("Unhandled v6 insn: smuad/smusd/smlad/smlsd\n"); break;
+    case 0x74: printf ("Unhandled v6 insn: smlald/smlsld\n"); break;
+    case 0x75: printf ("Unhandled v6 insn: smmla/smmls/smmul\n"); break;
+    case 0x78: printf ("Unhandled v6 insn: usad/usada8\n"); break;
+    case 0x7a: printf ("Unhandled v6 insn: usbfx\n"); break;
+    case 0x7c: printf ("Unhandled v6 insn: bfc/bfi\n"); break;
+
+    case 0x6a:
+      {
+       ARMword Rm;
+       int ror = -1;
+         
+       switch (BITS (4, 11))
+         {
+         case 0x07: ror = 0; break;
+         case 0x47: ror = 8; break;
+         case 0x87: ror = 16; break;
+         case 0xc7: ror = 24; break;
+
+         case 0x01:
+         case 0xf3:
+           printf ("Unhandled v6 insn: ssat\n");
+           return 0;
+         default:
+           break;
+         }
+       
+       if (ror == -1)
+         {
+           if (BITS (4, 6) == 0x7)
+             {
+               printf ("Unhandled v6 insn: ssat\n");
+               return 0;
+             }
+           break;
+         }
+
+       Rm = ((state->Reg[BITS (0, 3)] >> ror) & 0xFF);
+       if (Rm & 0x80)
+         Rm |= 0xffffff00;
+
+       if (BITS (16, 19) == 0xf)
+          /* SXTB */
+         state->Reg[BITS (12, 15)] = Rm;
+       else
+         /* SXTAB */
+         state->Reg[BITS (12, 15)] += Rm;
+      }
+      return 1;
+
+    case 0x6b:
+      {
+       ARMword Rm;
+       int ror = -1;
+         
+       switch (BITS (4, 11))
+         {
+         case 0x07: ror = 0; break;
+         case 0x47: ror = 8; break;
+         case 0x87: ror = 16; break;
+         case 0xc7: ror = 24; break;
+
+         case 0xfb:
+           printf ("Unhandled v6 insn: rev\n");
+           return 0;
+         default:
+           break;
+         }
+       
+       if (ror == -1)
+         break;
+
+       Rm = ((state->Reg[BITS (0, 3)] >> ror) & 0xFFFF);
+       if (Rm & 0x8000)
+         Rm |= 0xffff0000;
+
+       if (BITS (16, 19) == 0xf)
+         /* SXTH */
+         state->Reg[BITS (12, 15)] = Rm;
+       else
+         /* SXTAH */
+         state->Reg[BITS (12, 15)] = state->Reg[BITS (16, 19)] + Rm;
+      }
+      return 1;
+
+    case 0x6e:
+      {
+       ARMword Rm;
+       int ror = -1;
+         
+       switch (BITS (4, 11))
+         {
+         case 0x07: ror = 0; break;
+         case 0x47: ror = 8; break;
+         case 0x87: ror = 16; break;
+         case 0xc7: ror = 24; break;
+
+         case 0x01:
+         case 0xf3:
+           printf ("Unhandled v6 insn: usat\n");
+           return 0;
+         default:
+           break;
+         }
+       
+       if (ror == -1)
+         {
+           if (BITS (4, 6) == 0x7)
+             {
+               printf ("Unhandled v6 insn: usat\n");
+               return 0;
+             }
+           break;
+         }
+
+       Rm = ((state->Reg[BITS (0, 3)] >> ror) & 0xFF);
+
+       if (BITS (16, 19) == 0xf)
+          /* UXTB */
+         state->Reg[BITS (12, 15)] = Rm;
+       else
+         /* UXTAB */
+         state->Reg[BITS (12, 15)] = state->Reg[BITS (16, 19)] + Rm;
+      }
+      return 1;
+
+    case 0x6f:
+      {
+       ARMword Rm;
+       int ror = -1;
+         
+       switch (BITS (4, 11))
+         {
+         case 0x07: ror = 0; break;
+         case 0x47: ror = 8; break;
+         case 0x87: ror = 16; break;
+         case 0xc7: ror = 24; break;
+
+         case 0xfb:
+           printf ("Unhandled v6 insn: revsh\n");
+           return 0;
+         default:
+           break;
+         }
+       
+       if (ror == -1)
+         break;
+
+       Rm = ((state->Reg[BITS (0, 3)] >> ror) & 0xFFFF);
+
+       if (BITS (16, 19) == 0xf)
+         /* UXT */
+         state->Reg[BITS (12, 15)] = Rm;
+       else
+         {
+           /* UXTAH */
+           state->Reg[BITS (12, 15)] = state->Reg [BITS (16, 19)] + Rm;
+         }
+       }
+      return 1;
+
+#if 0
+    case 0x84: printf ("Unhandled v6 insn: srs\n"); break;
+#endif
+    default:
+      break;
+    }
+  printf ("Unhandled v6 insn: UNKNOWN: %08x\n", instr);
+  return 0;
+}
+
 /* EMULATION of ARM6.  */
 
 /* The PC pipeline value depends on whether ARM
@@ -374,12 +580,23 @@ ARMul_Emulate26 (ARMul_State * state)
 
       if (state->EventSet)
        ARMul_EnvokeEvent (state);
-#if 0
-      /* Enable this for a helpful bit of debugging when tracing is needed.  */
+#if 0 /* Enable this for a helpful bit of debugging when tracing is needed.  */
       fprintf (stderr, "pc: %x, instr: %x\n", pc & ~1, instr);
       if (instr == 0)
        abort ();
 #endif
+#if 0 /* Enable this code to help track down stack alignment bugs.  */
+      {
+       static ARMword old_sp = -1;
+
+       if (old_sp != state->Reg[13])
+         {
+           old_sp = state->Reg[13];
+           fprintf (stderr, "pc: %08x: SP set to %08x%s\n",
+                    pc & ~1, old_sp, (old_sp % 8) ? " [UNALIGNED!]" : "");
+         }
+      }
+#endif
 
       if (state->Exception)
        {
@@ -479,18 +696,23 @@ ARMul_Emulate26 (ARMul_State * state)
                  
                  state->Reg[14] = pc + 4;
                  
-                 dest = pc + 8 + 1; /* Force entry into Thumb mode.  */
+                 /* Force entry into Thumb mode.  */
+                 dest = pc + 8 + 1;
                  if (BIT (23))
                    dest += (NEGBRANCH + (BIT (24) << 1));
                  else
                    dest += POSBRANCH + (BIT (24) << 1);
-                 
+
                  WriteR15Branch (state, dest);
                  goto donext;
                }
              else if ((instr & 0xFC70F000) == 0xF450F000)
                /* The PLD instruction.  Ignored.  */
                goto donext;
+             else if (   ((instr & 0xfe500f00) == 0xfc100100)
+                      || ((instr & 0xfe500f00) == 0xfc000100))
+               /* wldrw and wstrw are unconditional.  */
+               goto mainswitch;
              else
                /* UNDEFINED in v5, UNPREDICTABLE in v3, v4, non executed in v1, v2.  */
                ARMul_UndefInstr (state, instr);
@@ -544,25 +766,32 @@ ARMul_Emulate26 (ARMul_State * state)
       /* Handle the Clock counter here.  */
       if (state->is_XScale)
        {
-         ARMword cp14r0 = state->CPRead[14] (state, 0, 0);
+         ARMword cp14r0;
+         int ok;
+
+         ok = state->CPRead[14] (state, 0, & cp14r0);
 
-         if (cp14r0 && ARMul_CP14_R0_ENABLE)
+         if (ok && (cp14r0 & ARMul_CP14_R0_ENABLE))
            {
-             unsigned long newcycles, nowtime = ARMul_Time(state);
+             unsigned long newcycles, nowtime = ARMul_Time (state);
 
              newcycles = nowtime - state->LastTime;
              state->LastTime = nowtime;
-             if (cp14r0 && ARMul_CP14_R0_CCD)
+
+             if (cp14r0 & ARMul_CP14_R0_CCD)
                {
                  if (state->CP14R0_CCD == -1)
                    state->CP14R0_CCD = newcycles;
                  else
                    state->CP14R0_CCD += newcycles;
+
                  if (state->CP14R0_CCD >= 64)
                    {
                      newcycles = 0;
+
                      while (state->CP14R0_CCD >= 64)
                        state->CP14R0_CCD -= 64, newcycles++;
+
                      goto check_PMUintr;
                    }
                }
@@ -576,10 +805,10 @@ check_PMUintr:
                  cp14r0 |= ARMul_CP14_R0_FLAG2;
                  (void) state->CPWrite[14] (state, 0, cp14r0);
 
-                 cp14r1 = state->CPRead[14] (state, 1, 0);
+                 ok = state->CPRead[14] (state, 1, & cp14r1);
 
                  /* Coded like this for portability.  */
-                 while (newcycles)
+                 while (ok && newcycles)
                    {
                      if (cp14r1 == 0xffffffff)
                        {
@@ -587,14 +816,19 @@ check_PMUintr:
                          do_int = 1;
                        }
                      else
-                       cp14r1++;
-                       newcycles--;
+                       cp14r1 ++;
+
+                     newcycles --;
                    }
+
                  (void) state->CPWrite[14] (state, 1, cp14r1);
+
                  if (do_int && (cp14r0 & ARMul_CP14_R0_INTEN2))
                    {
-                     if (state->CPRead[13] (state, 8, 0)
-                       && ARMul_CP13_R8_PMUS)
+                     ARMword temp;
+
+                     if (state->CPRead[13] (state, 8, & temp)
+                         && (temp & ARMul_CP13_R8_PMUS))
                        ARMul_Abort (state, ARMul_FIQV);
                      else
                        ARMul_Abort (state, ARMul_IRQV);
@@ -606,8 +840,8 @@ check_PMUintr:
       /* Handle hardware instructions breakpoints here.  */
       if (state->is_XScale)
        {
-         if ((pc | 3) == (read_cp15_reg (14, 0, 8) | 2)
-           || (pc | 3) == (read_cp15_reg (14, 0, 9) | 2))
+         if (   (pc | 3) == (read_cp15_reg (14, 0, 8) | 2)
+             || (pc | 3) == (read_cp15_reg (14, 0, 9) | 2))
            {
              if (XScale_debug_moe (state, ARMul_CP14_R10_MOE_IB))
                ARMul_OSHandleSWI (state, SWI_Breakpoint);
@@ -615,10 +849,9 @@ check_PMUintr:
        }
 
       /* Actual execution of instructions begins here.  */
-
+      /* If the condition codes don't match, stop here.  */
       if (temp)
        {
-         /* If the condition codes don't match, stop here.  */
        mainswitch:
 
          if (state->is_XScale)
@@ -677,6 +910,9 @@ check_PMUintr:
                      goto donext;
                    }
                }
+
+             if (ARMul_HandleIwmmxt (state, instr))
+               goto donext;
            }
 
          switch ((int) BITS (20, 27))
@@ -703,7 +939,8 @@ check_PMUintr:
                }
 #endif
              if (BITS (4, 7) == 9)
-               {               /* MUL */
+               {
+                 /* MUL */
                  rhs = state->Reg[MULRHSReg];
                  if (MULLHSReg == MULDESTReg)
                    {
@@ -713,16 +950,18 @@ check_PMUintr:
                  else if (MULDESTReg != 15)
                    state->Reg[MULDESTReg] = state->Reg[MULLHSReg] * rhs;
                  else
-                   {
-                     UNDEF_MULPCDest;
-                   }
-                 for (dest = 0, temp = 0; dest < 32; dest++)
+                   UNDEF_MULPCDest;
+
+                 for (dest = 0, temp = 0; dest < 32; dest ++)
                    if (rhs & (1L << dest))
-                     temp = dest;      /* mult takes this many/2 I cycles */
+                     temp = dest;
+
+                 /* Mult takes this many/2 I cycles.  */
                  ARMul_Icycles (state, ARMul_MultTable[temp], 0L);
                }
              else
-               {               /* AND reg */
+               {
+                 /* AND reg.  */
                  rhs = DPRegRHS;
                  dest = LHS & rhs;
                  WRITEDEST (dest);
@@ -732,15 +971,15 @@ check_PMUintr:
            case 0x01:          /* ANDS reg and MULS */
 #ifdef MODET
              if ((BITS (4, 11) & 0xF9) == 0x9)
-               {
-                 /* LDR register offset, no write-back, down, post indexed */
-                 LHPOSTDOWN ();
-                 /* fall through to rest of decoding */
-               }
+               /* LDR register offset, no write-back, down, post indexed.  */
+               LHPOSTDOWN ();
+             /* Fall through to rest of decoding.  */
 #endif
              if (BITS (4, 7) == 9)
-               {               /* MULS */
+               {
+                 /* MULS */
                  rhs = state->Reg[MULRHSReg];
+
                  if (MULLHSReg == MULDESTReg)
                    {
                      UNDEF_MULDestEQOp1;
@@ -755,16 +994,18 @@ check_PMUintr:
                      state->Reg[MULDESTReg] = dest;
                    }
                  else
-                   {
-                     UNDEF_MULPCDest;
-                   }
-                 for (dest = 0, temp = 0; dest < 32; dest++)
+                   UNDEF_MULPCDest;
+
+                 for (dest = 0, temp = 0; dest < 32; dest ++)
                    if (rhs & (1L << dest))
-                     temp = dest;      /* mult takes this many/2 I cycles */
+                     temp = dest;
+
+                 /* Mult takes this many/2 I cycles.  */
                  ARMul_Icycles (state, ARMul_MultTable[temp], 0L);
                }
              else
-               {               /* ANDS reg */
+               {
+                 /* ANDS reg.  */
                  rhs = DPSRegRHS;
                  dest = LHS & rhs;
                  WRITESDEST (dest);
@@ -775,7 +1016,7 @@ check_PMUintr:
 #ifdef MODET
              if (BITS (4, 11) == 0xB)
                {
-                 /* STRH register offset, write-back, down, post indexed */
+                 /* STRH register offset, write-back, down, post indexed */
                  SHDOWNWB ();
                  break;
                }
@@ -792,12 +1033,13 @@ check_PMUintr:
                    state->Reg[MULDESTReg] =
                      state->Reg[MULLHSReg] * rhs + state->Reg[MULACCReg];
                  else
-                   {
-                     UNDEF_MULPCDest;
-                   }
-                 for (dest = 0, temp = 0; dest < 32; dest++)
+                   UNDEF_MULPCDest;
+
+                 for (dest = 0, temp = 0; dest < 32; dest ++)
                    if (rhs & (1L << dest))
-                     temp = dest;      /* mult takes this many/2 I cycles */
+                     temp = dest;
+
+                 /* Mult takes this many/2 I cycles.  */
                  ARMul_Icycles (state, ARMul_MultTable[temp], 0L);
                }
              else
@@ -811,15 +1053,15 @@ check_PMUintr:
            case 0x03:          /* EORS reg and MLAS */
 #ifdef MODET
              if ((BITS (4, 11) & 0xF9) == 0x9)
-               {
-                 /* LDR register offset, write-back, down, post-indexed */
-                 LHPOSTDOWN ();
-                 /* fall through to rest of the decoding */
-               }
+               /* LDR register offset, write-back, down, post-indexed.  */
+               LHPOSTDOWN ();
+             /* Fall through to rest of the decoding.  */
 #endif
              if (BITS (4, 7) == 9)
-               {               /* MLAS */
+               {
+                 /* MLAS */
                  rhs = state->Reg[MULRHSReg];
+
                  if (MULLHSReg == MULDESTReg)
                    {
                      UNDEF_MULDestEQOp1;
@@ -835,16 +1077,18 @@ check_PMUintr:
                      state->Reg[MULDESTReg] = dest;
                    }
                  else
-                   {
-                     UNDEF_MULPCDest;
-                   }
-                 for (dest = 0, temp = 0; dest < 32; dest++)
+                   UNDEF_MULPCDest;
+
+                 for (dest = 0, temp = 0; dest < 32; dest ++)
                    if (rhs & (1L << dest))
-                     temp = dest;      /* mult takes this many/2 I cycles */
+                     temp = dest;
+
+                 /* Mult takes this many/2 I cycles.  */
                  ARMul_Icycles (state, ARMul_MultTable[temp], 0L);
                }
              else
-               {               /* EORS Reg */
+               {
+                 /* EORS Reg.  */
                  rhs = DPSRegRHS;
                  dest = LHS ^ rhs;
                  WRITESDEST (dest);
@@ -855,7 +1099,7 @@ check_PMUintr:
 #ifdef MODET
              if (BITS (4, 7) == 0xB)
                {
-                 /* STRH immediate offset, no write-back, down, post indexed */
+                 /* STRH immediate offset, no write-back, down, post indexed */
                  SHDOWNWB ();
                  break;
                }
@@ -878,15 +1122,14 @@ check_PMUintr:
            case 0x05:          /* SUBS reg */
 #ifdef MODET
              if ((BITS (4, 7) & 0x9) == 0x9)
-               {
-                 /* LDR immediate offset, no write-back, down, post indexed */
-                 LHPOSTDOWN ();
-                 /* fall through to the rest of the instruction decoding */
-               }
+               /* LDR immediate offset, no write-back, down, post indexed.  */
+               LHPOSTDOWN ();
+             /* Fall through to the rest of the instruction decoding.  */
 #endif
              lhs = LHS;
              rhs = DPRegRHS;
              dest = lhs - rhs;
+
              if ((lhs >= rhs) || ((rhs | lhs) >> 31))
                {
                  ARMul_SubCarry (state, lhs, rhs, dest);
@@ -904,7 +1147,7 @@ check_PMUintr:
 #ifdef MODET
              if (BITS (4, 7) == 0xB)
                {
-                 /* STRH immediate offset, write-back, down, post indexed */
+                 /* STRH immediate offset, write-back, down, post indexed */
                  SHDOWNWB ();
                  break;
                }
@@ -917,15 +1160,14 @@ check_PMUintr:
            case 0x07:          /* RSBS reg */
 #ifdef MODET
              if ((BITS (4, 7) & 0x9) == 0x9)
-               {
-                 /* LDR immediate offset, write-back, down, post indexed */
-                 LHPOSTDOWN ();
-                 /* fall through to remainder of instruction decoding */
-               }
+               /* LDR immediate offset, write-back, down, post indexed.  */
+               LHPOSTDOWN ();
+             /* Fall through to remainder of instruction decoding.  */
 #endif
              lhs = LHS;
              rhs = DPRegRHS;
              dest = rhs - lhs;
+
              if ((rhs >= lhs) || ((rhs | lhs) >> 31))
                {
                  ARMul_SubCarry (state, rhs, lhs, dest);
@@ -943,7 +1185,7 @@ check_PMUintr:
 #ifdef MODET
              if (BITS (4, 11) == 0xB)
                {
-                 /* STRH register offset, no write-back, up, post indexed */
+                 /* STRH register offset, no write-back, up, post indexed */
                  SHUPWB ();
                  break;
                }
@@ -960,7 +1202,8 @@ check_PMUintr:
 #endif
 #ifdef MODET
              if (BITS (4, 7) == 0x9)
-               {               /* MULL */
+               {
+                 /* MULL */
                  /* 32x32 = 64 */
                  ARMul_Icycles (state,
                                 Multiply64 (state, instr, LUNSIGNED,
@@ -976,15 +1219,14 @@ check_PMUintr:
            case 0x09:          /* ADDS reg */
 #ifdef MODET
              if ((BITS (4, 11) & 0xF9) == 0x9)
-               {
-                 /* LDR register offset, no write-back, up, post indexed */
-                 LHPOSTUP ();
-                 /* fall through to remaining instruction decoding */
-               }
+               /* LDR register offset, no write-back, up, post indexed.  */
+               LHPOSTUP ();
+             /* Fall through to remaining instruction decoding.  */
 #endif
 #ifdef MODET
              if (BITS (4, 7) == 0x9)
-               {               /* MULL */
+               {
+                 /* MULL */
                  /* 32x32=64 */
                  ARMul_Icycles (state,
                                 Multiply64 (state, instr, LUNSIGNED, LSCC),
@@ -997,7 +1239,8 @@ check_PMUintr:
              dest = lhs + rhs;
              ASSIGNZ (dest == 0);
              if ((lhs | rhs) >> 30)
-               {               /* possible C,V,N to set */
+               {
+                 /* Possible C,V,N to set.  */
                  ASSIGNN (NEG (dest));
                  ARMul_AddCarry (state, lhs, rhs, dest);
                  ARMul_AddOverflow (state, lhs, rhs, dest);
@@ -1015,14 +1258,13 @@ check_PMUintr:
 #ifdef MODET
              if (BITS (4, 11) == 0xB)
                {
-                 /* STRH register offset, write-back, up, post-indexed */
+                 /* STRH register offset, write-back, up, post-indexed */
                  SHUPWB ();
                  break;
                }
-#endif
-#ifdef MODET
              if (BITS (4, 7) == 0x9)
-               {               /* MULL */
+               {
+                 /* MULL */
                  /* 32x32=64 */
                  ARMul_Icycles (state,
                                 MultiplyAdd64 (state, instr, LUNSIGNED,
@@ -1038,15 +1280,12 @@ check_PMUintr:
            case 0x0b:          /* ADCS reg */
 #ifdef MODET
              if ((BITS (4, 11) & 0xF9) == 0x9)
-               {
-                 /* LDR register offset, write-back, up, post indexed */
-                 LHPOSTUP ();
-                 /* fall through to remaining instruction decoding */
-               }
-#endif
-#ifdef MODET
+               /* LDR register offset, write-back, up, post indexed.  */
+               LHPOSTUP ();
+             /* Fall through to remaining instruction decoding.  */
              if (BITS (4, 7) == 0x9)
-               {               /* MULL */
+               {
+                 /* MULL */
                  /* 32x32=64 */
                  ARMul_Icycles (state,
                                 MultiplyAdd64 (state, instr, LUNSIGNED,
@@ -1059,7 +1298,8 @@ check_PMUintr:
              dest = lhs + rhs + CFLAG;
              ASSIGNZ (dest == 0);
              if ((lhs | rhs) >> 30)
-               {               /* possible C,V,N to set */
+               {
+                 /* Possible C,V,N to set.  */
                  ASSIGNN (NEG (dest));
                  ARMul_AddCarry (state, lhs, rhs, dest);
                  ARMul_AddOverflow (state, lhs, rhs, dest);
@@ -1077,7 +1317,7 @@ check_PMUintr:
 #ifdef MODET
              if (BITS (4, 7) == 0xB)
                {
-                 /* STRH immediate offset, no write-back, up post indexed */
+                 /* STRH immediate offset, no write-back, up post indexed */
                  SHUPWB ();
                  break;
                }
@@ -1091,10 +1331,9 @@ check_PMUintr:
                  Handle_Store_Double (state, instr);
                  break;
                }
-#endif
-#ifdef MODET
              if (BITS (4, 7) == 0x9)
-               {               /* MULL */
+               {
+                 /* MULL */
                  /* 32x32=64 */
                  ARMul_Icycles (state,
                                 Multiply64 (state, instr, LSIGNED, LDEFAULT),
@@ -1110,14 +1349,12 @@ check_PMUintr:
            case 0x0d:          /* SBCS reg */
 #ifdef MODET
              if ((BITS (4, 7) & 0x9) == 0x9)
-               {
-                 /* LDR immediate offset, no write-back, up, post indexed */
-                 LHPOSTUP ();
-               }
-#endif
-#ifdef MODET
+               /* LDR immediate offset, no write-back, up, post indexed.  */
+               LHPOSTUP ();
+
              if (BITS (4, 7) == 0x9)
-               {               /* MULL */
+               {
+                 /* MULL */
                  /* 32x32=64 */
                  ARMul_Icycles (state,
                                 Multiply64 (state, instr, LSIGNED, LSCC),
@@ -1145,14 +1382,14 @@ check_PMUintr:
 #ifdef MODET
              if (BITS (4, 7) == 0xB)
                {
-                 /* STRH immediate offset, write-back, up, post indexed */
+                 /* STRH immediate offset, write-back, up, post indexed */
                  SHUPWB ();
                  break;
                }
-#endif
-#ifdef MODET
+
              if (BITS (4, 7) == 0x9)
-               {               /* MULL */
+               {
+                 /* MULL */
                  /* 32x32=64 */
                  ARMul_Icycles (state,
                                 MultiplyAdd64 (state, instr, LSIGNED,
@@ -1168,15 +1405,13 @@ check_PMUintr:
            case 0x0f:          /* RSCS reg */
 #ifdef MODET
              if ((BITS (4, 7) & 0x9) == 0x9)
-               {
-                 /* LDR immediate offset, write-back, up, post indexed */
-                 LHPOSTUP ();
-                 /* fall through to remaining instruction decoding */
-               }
-#endif
-#ifdef MODET
+               /* LDR immediate offset, write-back, up, post indexed.  */
+               LHPOSTUP ();
+             /* Fall through to remaining instruction decoding.  */
+
              if (BITS (4, 7) == 0x9)
-               {               /* MULL */
+               {
+                 /* MULL */
                  /* 32x32=64 */
                  ARMul_Icycles (state,
                                 MultiplyAdd64 (state, instr, LSIGNED, LSCC),
@@ -1187,6 +1422,7 @@ check_PMUintr:
              lhs = LHS;
              rhs = DPRegRHS;
              dest = rhs - lhs - !CFLAG;
+
              if ((rhs >= lhs) || ((rhs | lhs) >> 31))
                {
                  ARMul_SubCarry (state, rhs, lhs, dest);
@@ -1200,7 +1436,7 @@ check_PMUintr:
              WRITESDEST (dest);
              break;
 
-           case 0x10:          /* TST reg and MRS CPSR and SWP word */
+           case 0x10:          /* TST reg and MRS CPSR and SWP word */
              if (state->is_v5e)
                {
                  if (BIT (4) == 0 && BIT (7) == 1)
@@ -1246,7 +1482,7 @@ check_PMUintr:
 #ifdef MODET
              if (BITS (4, 11) == 0xB)
                {
-                 /* STRH register offset, no write-back, down, pre indexed */
+                 /* STRH register offset, no write-back, down, pre indexed */
                  SHPREDOWN ();
                  break;
                }
@@ -1262,7 +1498,8 @@ check_PMUintr:
                }
 #endif
              if (BITS (4, 11) == 9)
-               {               /* SWP */
+               {
+                 /* SWP */
                  UNDEF_SWPPC;
                  temp = LHS;
                  BUSUSEDINCPCS;
@@ -1281,9 +1518,7 @@ check_PMUintr:
                  else
                    DEST = dest;
                  if (state->abortSig || state->Aborted)
-                   {
-                     TAKEABORT;
-                   }
+                   TAKEABORT;
                }
              else if ((BITS (0, 11) == 0) && (LHSReg == 15))
                {               /* MRS CPSR */
@@ -1299,14 +1534,13 @@ check_PMUintr:
            case 0x11:          /* TSTP reg */
 #ifdef MODET
              if ((BITS (4, 11) & 0xF9) == 0x9)
-               {
-                 /* LDR register offset, no write-back, down, pre indexed */
-                 LHPREDOWN ();
-                 /* continue with remaining instruction decode */
-               }
+               /* LDR register offset, no write-back, down, pre indexed.  */
+               LHPREDOWN ();
+             /* Continue with remaining instruction decode.  */
 #endif
              if (DESTReg == 15)
-               {               /* TSTP reg */
+               {
+                 /* TSTP reg */
 #ifdef MODE32
                  state->Cpsr = GETSPSR (state->Bank);
                  ARMul_CPSRAltered (state);
@@ -1317,14 +1551,15 @@ check_PMUintr:
 #endif
                }
              else
-               {               /* TST reg */
+               {
+                 /* TST reg */
                  rhs = DPSRegRHS;
                  dest = LHS & rhs;
                  ARMul_NegZero (state, dest);
                }
              break;
 
-           case 0x12:          /* TEQ reg and MSR reg to CPSR (ARM6) */
+           case 0x12:          /* TEQ reg and MSR reg to CPSR (ARM6) */
              if (state->is_v5)
                {
                  if (BITS (4, 7) == 3)
@@ -1349,9 +1584,9 @@ check_PMUintr:
                      && (BIT (5) == 0 || BITS (12, 15) == 0))
                    {
                      /* ElSegundo SMLAWy/SMULWy insn.  */
-                     unsigned long long op1 = state->Reg[BITS (0, 3)];
-                     unsigned long long op2 = state->Reg[BITS (8, 11)];
-                     unsigned long long result;
+                     ARMdword op1 = state->Reg[BITS (0, 3)];
+                     ARMdword op2 = state->Reg[BITS (8, 11)];
+                     ARMdword result;
 
                      if (BIT (6))
                        op2 >>= 16;
@@ -1394,7 +1629,7 @@ check_PMUintr:
 #ifdef MODET
              if (BITS (4, 11) == 0xB)
                {
-                 /* STRH register offset, write-back, down, pre indexed */
+                 /* STRH register offset, write-back, down, pre indexed */
                  SHPREDOWNWB ();
                  break;
                }
@@ -1436,8 +1671,8 @@ check_PMUintr:
                        ARMul_OSHandleSWI (state, SWI_Breakpoint);
                      else
                        {
-                       /* BKPT - normally this will cause an abort, but on the
-                          XScale we must check the DCSR.  */
+                         /* BKPT - normally this will cause an abort, but on the
+                            XScale we must check the DCSR.  */
                          XScale_set_fsr_far (state, ARMul_CP15_R5_MMU_EXCPT, pc);
                          if (!XScale_debug_moe (state, ARMul_CP14_R10_MOE_BT))
                            break;
@@ -1450,7 +1685,7 @@ check_PMUintr:
                }
              if (DESTReg == 15)
                {
-                 /* MSR reg to CPSR */
+                 /* MSR reg to CPSR */
                  UNDEF_MSRPC;
                  temp = DPRegRHS;
 #ifdef MODET
@@ -1460,22 +1695,20 @@ check_PMUintr:
                  ARMul_FixCPSR (state, instr, temp);
                }
              else
-               {
-                 UNDEF_Test;
-               }
+               UNDEF_Test;
+
              break;
 
            case 0x13:          /* TEQP reg */
 #ifdef MODET
              if ((BITS (4, 11) & 0xF9) == 0x9)
-               {
-                 /* LDR register offset, write-back, down, pre indexed.  */
-                 LHPREDOWNWB ();
-                 /* Continue with remaining instruction decode.  */
-               }
+               /* LDR register offset, write-back, down, pre indexed.  */
+               LHPREDOWNWB ();
+             /* Continue with remaining instruction decode.  */
 #endif
              if (DESTReg == 15)
-               {               /* TEQP reg */
+               {
+                 /* TEQP reg */
 #ifdef MODE32
                  state->Cpsr = GETSPSR (state->Bank);
                  ARMul_CPSRAltered (state);
@@ -1486,23 +1719,24 @@ check_PMUintr:
 #endif
                }
              else
-               {               /* TEQ Reg */
+               {
+                 /* TEQ Reg.  */
                  rhs = DPSRegRHS;
                  dest = LHS ^ rhs;
                  ARMul_NegZero (state, dest);
                }
              break;
 
-           case 0x14:          /* CMP reg and MRS SPSR and SWP byte */
+           case 0x14:          /* CMP reg and MRS SPSR and SWP byte */
              if (state->is_v5e)
                {
                  if (BIT (4) == 0 && BIT (7) == 1)
                    {
                      /* ElSegundo SMLALxy insn.  */
-                     unsigned long long op1 = state->Reg[BITS (0, 3)];
-                     unsigned long long op2 = state->Reg[BITS (8, 11)];
-                     unsigned long long dest;
-                     unsigned long long result;
+                     ARMdword op1 = state->Reg[BITS (0, 3)];
+                     ARMdword op2 = state->Reg[BITS (8, 11)];
+                     ARMdword dest;
+                     ARMdword result;
 
                      if (BIT (5))
                        op1 >>= 16;
@@ -1515,7 +1749,7 @@ check_PMUintr:
                      if (op2 & 0x8000)
                        op2 -= 65536;
 
-                     dest = (unsigned long long) state->Reg[BITS (16, 19)] << 32;
+                     dest = (ARMdword) state->Reg[BITS (16, 19)] << 32;
                      dest |= state->Reg[BITS (12, 15)];
                      dest += op1 * op2;
                      state->Reg[BITS (12, 15)] = dest;
@@ -1567,7 +1801,8 @@ check_PMUintr:
                }
 #endif
              if (BITS (4, 11) == 9)
-               {               /* SWP */
+               {
+                 /* SWP */
                  UNDEF_SWPPC;
                  temp = LHS;
                  BUSUSEDINCPCS;
@@ -1582,32 +1817,29 @@ check_PMUintr:
 #endif
                    DEST = ARMul_SwapByte (state, temp, state->Reg[RHSReg]);
                  if (state->abortSig || state->Aborted)
-                   {
-                     TAKEABORT;
-                   }
+                   TAKEABORT;
                }
              else if ((BITS (0, 11) == 0) && (LHSReg == 15))
-               {               /* MRS SPSR */
+               {
+                 /* MRS SPSR */
                  UNDEF_MRSPC;
                  DEST = GETSPSR (state->Bank);
                }
              else
-               {
-                 UNDEF_Test;
-               }
+               UNDEF_Test;
+
              break;
 
-           case 0x15:          /* CMPP reg */
+           case 0x15:          /* CMPP reg */
 #ifdef MODET
              if ((BITS (4, 7) & 0x9) == 0x9)
-               {
-                 /* LDR immediate offset, no write-back, down, pre indexed */
-                 LHPREDOWN ();
-                 /* continue with remaining instruction decode */
-               }
+               /* LDR immediate offset, no write-back, down, pre indexed.  */
+               LHPREDOWN ();
+             /* Continue with remaining instruction decode.  */
 #endif
              if (DESTReg == 15)
-               {               /* CMPP reg */
+               {
+                 /* CMPP reg.  */
 #ifdef MODE32
                  state->Cpsr = GETSPSR (state->Bank);
                  ARMul_CPSRAltered (state);
@@ -1618,7 +1850,8 @@ check_PMUintr:
 #endif
                }
              else
-               {               /* CMP reg */
+               {
+                 /* CMP reg.  */
                  lhs = LHS;
                  rhs = DPRegRHS;
                  dest = lhs - rhs;
@@ -1706,7 +1939,7 @@ check_PMUintr:
 #ifdef MODET
              if (BITS (4, 7) == 0xB)
                {
-                 /* STRH immediate offset, write-back, down, pre indexed */
+                 /* STRH immediate offset, write-back, down, pre indexed */
                  SHPREDOWNWB ();
                  break;
                }
@@ -1722,7 +1955,8 @@ check_PMUintr:
                }
 #endif
              if (DESTReg == 15)
-               {               /* MSR */
+               {
+                 /* MSR */
                  UNDEF_MSRPC;
                  ARMul_FixSPSR (state, instr, DPRegRHS);
                }
@@ -1735,11 +1969,9 @@ check_PMUintr:
            case 0x17:          /* CMNP reg */
 #ifdef MODET
              if ((BITS (4, 7) & 0x9) == 0x9)
-               {
-                 /* LDR immediate offset, write-back, down, pre indexed */
-                 LHPREDOWNWB ();
-                 /* continue with remaining instruction decoding */
-               }
+               /* LDR immediate offset, write-back, down, pre indexed.  */
+               LHPREDOWNWB ();
+             /* Continue with remaining instruction decoding.  */
 #endif
              if (DESTReg == 15)
                {
@@ -1754,13 +1986,15 @@ check_PMUintr:
                  break;
                }
              else
-               {               /* CMN reg */
+               {
+                 /* CMN reg.  */
                  lhs = LHS;
                  rhs = DPRegRHS;
                  dest = lhs + rhs;
                  ASSIGNZ (dest == 0);
                  if ((lhs | rhs) >> 30)
-                   {           /* possible C,V,N to set */
+                   {
+                     /* Possible C,V,N to set.  */
                      ASSIGNN (NEG (dest));
                      ARMul_AddCarry (state, lhs, rhs, dest);
                      ARMul_AddOverflow (state, lhs, rhs, dest);
@@ -1778,7 +2012,7 @@ check_PMUintr:
 #ifdef MODET
              if (BITS (4, 11) == 0xB)
                {
-                 /* STRH register offset, no write-back, up, pre indexed */
+                 /* STRH register offset, no write-back, up, pre indexed */
                  SHPREUP ();
                  break;
                }
@@ -1801,11 +2035,9 @@ check_PMUintr:
            case 0x19:          /* ORRS reg */
 #ifdef MODET
              if ((BITS (4, 11) & 0xF9) == 0x9)
-               {
-                 /* LDR register offset, no write-back, up, pre indexed */
-                 LHPREUP ();
-                 /* continue with remaining instruction decoding */
-               }
+               /* LDR register offset, no write-back, up, pre indexed.  */
+               LHPREUP ();
+             /* Continue with remaining instruction decoding.  */
 #endif
              rhs = DPSRegRHS;
              dest = LHS | rhs;
@@ -1816,7 +2048,7 @@ check_PMUintr:
 #ifdef MODET
              if (BITS (4, 11) == 0xB)
                {
-                 /* STRH register offset, write-back, up, pre indexed */
+                 /* STRH register offset, write-back, up, pre indexed */
                  SHPREUPWB ();
                  break;
                }
@@ -1838,11 +2070,9 @@ check_PMUintr:
            case 0x1b:          /* MOVS reg */
 #ifdef MODET
              if ((BITS (4, 11) & 0xF9) == 0x9)
-               {
-                 /* LDR register offset, write-back, up, pre indexed */
-                 LHPREUPWB ();
-                 /* continue with remaining instruction decoding */
-               }
+               /* LDR register offset, write-back, up, pre indexed.  */
+               LHPREUPWB ();
+             /* Continue with remaining instruction decoding.  */
 #endif
              dest = DPSRegRHS;
              WRITESDEST (dest);
@@ -1852,7 +2082,7 @@ check_PMUintr:
 #ifdef MODET
              if (BITS (4, 7) == 0xB)
                {
-                 /* STRH immediate offset, no write-back, up, pre indexed */
+                 /* STRH immediate offset, no write-back, up, pre indexed */
                  SHPREUP ();
                  break;
                }
@@ -1875,11 +2105,9 @@ check_PMUintr:
            case 0x1d:          /* BICS reg */
 #ifdef MODET
              if ((BITS (4, 7) & 0x9) == 0x9)
-               {
-                 /* LDR immediate offset, no write-back, up, pre indexed */
-                 LHPREUP ();
-                 /* continue with instruction decoding */
-               }
+               /* LDR immediate offset, no write-back, up, pre indexed.  */
+               LHPREUP ();
+             /* Continue with instruction decoding.  */
 #endif
              rhs = DPSRegRHS;
              dest = LHS & ~rhs;
@@ -1890,7 +2118,7 @@ check_PMUintr:
 #ifdef MODET
              if (BITS (4, 7) == 0xB)
                {
-                 /* STRH immediate offset, write-back, up, pre indexed */
+                 /* STRH immediate offset, write-back, up, pre indexed */
                  SHPREUPWB ();
                  break;
                }
@@ -1912,17 +2140,15 @@ check_PMUintr:
            case 0x1f:          /* MVNS reg */
 #ifdef MODET
              if ((BITS (4, 7) & 0x9) == 0x9)
-               {
-                 /* LDR immediate offset, write-back, up, pre indexed */
-                 LHPREUPWB ();
-                 /* continue instruction decoding */
-               }
+               /* LDR immediate offset, write-back, up, pre indexed.  */
+               LHPREUPWB ();
+             /* Continue instruction decoding.  */
 #endif
              dest = ~DPSRegRHS;
              WRITESDEST (dest);
              break;
 
-             
+
              /* Data Processing Immediate RHS Instructions.  */
 
            case 0x20:          /* AND immed */
@@ -1956,6 +2182,7 @@ check_PMUintr:
              lhs = LHS;
              rhs = DPImmRHS;
              dest = lhs - rhs;
+
              if ((lhs >= rhs) || ((rhs | lhs) >> 31))
                {
                  ARMul_SubCarry (state, lhs, rhs, dest);
@@ -1978,6 +2205,7 @@ check_PMUintr:
              lhs = LHS;
              rhs = DPImmRHS;
              dest = rhs - lhs;
+
              if ((rhs >= lhs) || ((rhs | lhs) >> 31))
                {
                  ARMul_SubCarry (state, rhs, lhs, dest);
@@ -2001,8 +2229,10 @@ check_PMUintr:
              rhs = DPImmRHS;
              dest = lhs + rhs;
              ASSIGNZ (dest == 0);
+
              if ((lhs | rhs) >> 30)
-               {               /* possible C,V,N to set */
+               {
+                 /* Possible C,V,N to set.  */
                  ASSIGNN (NEG (dest));
                  ARMul_AddCarry (state, lhs, rhs, dest);
                  ARMul_AddOverflow (state, lhs, rhs, dest);
@@ -2027,7 +2257,8 @@ check_PMUintr:
              dest = lhs + rhs + CFLAG;
              ASSIGNZ (dest == 0);
              if ((lhs | rhs) >> 30)
-               {               /* possible C,V,N to set */
+               {
+                 /* Possible C,V,N to set.  */
                  ASSIGNN (NEG (dest));
                  ARMul_AddCarry (state, lhs, rhs, dest);
                  ARMul_AddOverflow (state, lhs, rhs, dest);
@@ -2091,7 +2322,8 @@ check_PMUintr:
 
            case 0x31:          /* TSTP immed */
              if (DESTReg == 15)
-               {               /* TSTP immed */
+               {
+                 /* TSTP immed.  */
 #ifdef MODE32
                  state->Cpsr = GETSPSR (state->Bank);
                  ARMul_CPSRAltered (state);
@@ -2102,7 +2334,8 @@ check_PMUintr:
                }
              else
                {
-                 DPSImmRHS;    /* TST immed */
+                 /* TST immed.  */
+                 DPSImmRHS;
                  dest = LHS & rhs;
                  ARMul_NegZero (state, dest);
                }
@@ -2110,18 +2343,16 @@ check_PMUintr:
 
            case 0x32:          /* TEQ immed and MSR immed to CPSR */
              if (DESTReg == 15)
-               {               /* MSR immed to CPSR */
-                 ARMul_FixCPSR (state, instr, DPImmRHS);
-               }
+               /* MSR immed to CPSR.  */
+               ARMul_FixCPSR (state, instr, DPImmRHS);
              else
-               {
-                 UNDEF_Test;
-               }
+               UNDEF_Test;
              break;
 
            case 0x33:          /* TEQP immed */
              if (DESTReg == 15)
-               {               /* TEQP immed */
+               {
+                 /* TEQP immed.  */
 #ifdef MODE32
                  state->Cpsr = GETSPSR (state->Bank);
                  ARMul_CPSRAltered (state);
@@ -2144,7 +2375,8 @@ check_PMUintr:
 
            case 0x35:          /* CMPP immed */
              if (DESTReg == 15)
-               {               /* CMPP immed */
+               {
+                 /* CMPP immed.  */
 #ifdef MODE32
                  state->Cpsr = GETSPSR (state->Bank);
                  ARMul_CPSRAltered (state);
@@ -2156,10 +2388,12 @@ check_PMUintr:
                }
              else
                {
-                 lhs = LHS;    /* CMP immed */
+                 /* CMP immed.  */
+                 lhs = LHS;
                  rhs = DPImmRHS;
                  dest = lhs - rhs;
                  ARMul_NegZero (state, dest);
+
                  if ((lhs >= rhs) || ((rhs | lhs) >> 31))
                    {
                      ARMul_SubCarry (state, lhs, rhs, dest);
@@ -2174,17 +2408,16 @@ check_PMUintr:
              break;
 
            case 0x36:          /* CMN immed and MSR immed to SPSR */
-             if (DESTReg == 15)        /* MSR */
+             if (DESTReg == 15)
                ARMul_FixSPSR (state, instr, DPImmRHS);
              else
-               {
-                 UNDEF_Test;
-               }
+               UNDEF_Test;
              break;
 
-           case 0x37:          /* CMNP immed */
+           case 0x37:          /* CMNP immed */
              if (DESTReg == 15)
-               {               /* CMNP immed */
+               {
+                 /* CMNP immed.  */
 #ifdef MODE32
                  state->Cpsr = GETSPSR (state->Bank);
                  ARMul_CPSRAltered (state);
@@ -2196,12 +2429,14 @@ check_PMUintr:
                }
              else
                {
-                 lhs = LHS;    /* CMN immed */
+                 /* CMN immed.  */
+                 lhs = LHS;
                  rhs = DPImmRHS;
                  dest = lhs + rhs;
                  ASSIGNZ (dest == 0);
                  if ((lhs | rhs) >> 30)
-                   {           /* possible C,V,N to set */
+                   {
+                     /* Possible C,V,N to set.  */
                      ASSIGNN (NEG (dest));
                      ARMul_AddCarry (state, lhs, rhs, dest);
                      ARMul_AddOverflow (state, lhs, rhs, dest);
@@ -2215,63 +2450,64 @@ check_PMUintr:
                }
              break;
 
-           case 0x38:          /* ORR immed */
+           case 0x38:          /* ORR immed */
              dest = LHS | DPImmRHS;
              WRITEDEST (dest);
              break;
 
-           case 0x39:          /* ORRS immed */
+           case 0x39:          /* ORRS immed */
              DPSImmRHS;
              dest = LHS | rhs;
              WRITESDEST (dest);
              break;
 
-           case 0x3a:          /* MOV immed */
+           case 0x3a:          /* MOV immed */
              dest = DPImmRHS;
              WRITEDEST (dest);
              break;
 
-           case 0x3b:          /* MOVS immed */
+           case 0x3b:          /* MOVS immed */
              DPSImmRHS;
              WRITESDEST (rhs);
              break;
 
-           case 0x3c:          /* BIC immed */
+           case 0x3c:          /* BIC immed */
              dest = LHS & ~DPImmRHS;
              WRITEDEST (dest);
              break;
 
-           case 0x3d:          /* BICS immed */
+           case 0x3d:          /* BICS immed */
              DPSImmRHS;
              dest = LHS & ~rhs;
              WRITESDEST (dest);
              break;
 
-           case 0x3e:          /* MVN immed */
+           case 0x3e:          /* MVN immed */
              dest = ~DPImmRHS;
              WRITEDEST (dest);
              break;
 
-           case 0x3f:          /* MVNS immed */
+           case 0x3f:          /* MVNS immed */
              DPSImmRHS;
              WRITESDEST (~rhs);
              break;
 
+
              /* Single Data Transfer Immediate RHS Instructions.  */
 
-           case 0x40:          /* Store Word, No WriteBack, Post Dec, Immed */
+           case 0x40:          /* Store Word, No WriteBack, Post Dec, Immed */
              lhs = LHS;
              if (StoreWord (state, instr, lhs))
                LSBase = lhs - LSImmRHS;
              break;
 
-           case 0x41:          /* Load Word, No WriteBack, Post Dec, Immed */
+           case 0x41:          /* Load Word, No WriteBack, Post Dec, Immed */
              lhs = LHS;
              if (LoadWord (state, instr, lhs))
                LSBase = lhs - LSImmRHS;
              break;
 
-           case 0x42:          /* Store Word, WriteBack, Post Dec, Immed */
+           case 0x42:          /* Store Word, WriteBack, Post Dec, Immed */
              UNDEF_LSRBaseEQDestWb;
              UNDEF_LSRPCBaseWb;
              lhs = LHS;
@@ -2282,7 +2518,7 @@ check_PMUintr:
              state->NtransSig = (state->Mode & 3) ? HIGH : LOW;
              break;
 
-           case 0x43:          /* Load Word, WriteBack, Post Dec, Immed */
+           case 0x43:          /* Load Word, WriteBack, Post Dec, Immed */
              UNDEF_LSRBaseEQDestWb;
              UNDEF_LSRPCBaseWb;
              lhs = LHS;
@@ -2292,19 +2528,19 @@ check_PMUintr:
              state->NtransSig = (state->Mode & 3) ? HIGH : LOW;
              break;
 
-           case 0x44:          /* Store Byte, No WriteBack, Post Dec, Immed */
+           case 0x44:          /* Store Byte, No WriteBack, Post Dec, Immed */
              lhs = LHS;
              if (StoreByte (state, instr, lhs))
                LSBase = lhs - LSImmRHS;
              break;
 
-           case 0x45:          /* Load Byte, No WriteBack, Post Dec, Immed */
+           case 0x45:          /* Load Byte, No WriteBack, Post Dec, Immed */
              lhs = LHS;
              if (LoadByte (state, instr, lhs, LUNSIGNED))
                LSBase = lhs - LSImmRHS;
              break;
 
-           case 0x46:          /* Store Byte, WriteBack, Post Dec, Immed */
+           case 0x46:          /* Store Byte, WriteBack, Post Dec, Immed */
              UNDEF_LSRBaseEQDestWb;
              UNDEF_LSRPCBaseWb;
              lhs = LHS;
@@ -2314,7 +2550,7 @@ check_PMUintr:
              state->NtransSig = (state->Mode & 3) ? HIGH : LOW;
              break;
 
-           case 0x47:          /* Load Byte, WriteBack, Post Dec, Immed */
+           case 0x47:          /* Load Byte, WriteBack, Post Dec, Immed */
              UNDEF_LSRBaseEQDestWb;
              UNDEF_LSRPCBaseWb;
              lhs = LHS;
@@ -2324,19 +2560,19 @@ check_PMUintr:
              state->NtransSig = (state->Mode & 3) ? HIGH : LOW;
              break;
 
-           case 0x48:          /* Store Word, No WriteBack, Post Inc, Immed */
+           case 0x48:          /* Store Word, No WriteBack, Post Inc, Immed */
              lhs = LHS;
              if (StoreWord (state, instr, lhs))
                LSBase = lhs + LSImmRHS;
              break;
 
-           case 0x49:          /* Load Word, No WriteBack, Post Inc, Immed */
+           case 0x49:          /* Load Word, No WriteBack, Post Inc, Immed */
              lhs = LHS;
              if (LoadWord (state, instr, lhs))
                LSBase = lhs + LSImmRHS;
              break;
 
-           case 0x4a:          /* Store Word, WriteBack, Post Inc, Immed */
+           case 0x4a:          /* Store Word, WriteBack, Post Inc, Immed */
              UNDEF_LSRBaseEQDestWb;
              UNDEF_LSRPCBaseWb;
              lhs = LHS;
@@ -2346,7 +2582,7 @@ check_PMUintr:
              state->NtransSig = (state->Mode & 3) ? HIGH : LOW;
              break;
 
-           case 0x4b:          /* Load Word, WriteBack, Post Inc, Immed */
+           case 0x4b:          /* Load Word, WriteBack, Post Inc, Immed */
              UNDEF_LSRBaseEQDestWb;
              UNDEF_LSRPCBaseWb;
              lhs = LHS;
@@ -2356,19 +2592,19 @@ check_PMUintr:
              state->NtransSig = (state->Mode & 3) ? HIGH : LOW;
              break;
 
-           case 0x4c:          /* Store Byte, No WriteBack, Post Inc, Immed */
+           case 0x4c:          /* Store Byte, No WriteBack, Post Inc, Immed */
              lhs = LHS;
              if (StoreByte (state, instr, lhs))
                LSBase = lhs + LSImmRHS;
              break;
 
-           case 0x4d:          /* Load Byte, No WriteBack, Post Inc, Immed */
+           case 0x4d:          /* Load Byte, No WriteBack, Post Inc, Immed */
              lhs = LHS;
              if (LoadByte (state, instr, lhs, LUNSIGNED))
                LSBase = lhs + LSImmRHS;
              break;
 
-           case 0x4e:          /* Store Byte, WriteBack, Post Inc, Immed */
+           case 0x4e:          /* Store Byte, WriteBack, Post Inc, Immed */
              UNDEF_LSRBaseEQDestWb;
              UNDEF_LSRPCBaseWb;
              lhs = LHS;
@@ -2378,7 +2614,7 @@ check_PMUintr:
              state->NtransSig = (state->Mode & 3) ? HIGH : LOW;
              break;
 
-           case 0x4f:          /* Load Byte, WriteBack, Post Inc, Immed */
+           case 0x4f:          /* Load Byte, WriteBack, Post Inc, Immed */
              UNDEF_LSRBaseEQDestWb;
              UNDEF_LSRPCBaseWb;
              lhs = LHS;
@@ -2389,15 +2625,15 @@ check_PMUintr:
              break;
 
 
-           case 0x50:          /* Store Word, No WriteBack, Pre Dec, Immed */
+           case 0x50:          /* Store Word, No WriteBack, Pre Dec, Immed */
              (void) StoreWord (state, instr, LHS - LSImmRHS);
              break;
 
-           case 0x51:          /* Load Word, No WriteBack, Pre Dec, Immed */
+           case 0x51:          /* Load Word, No WriteBack, Pre Dec, Immed */
              (void) LoadWord (state, instr, LHS - LSImmRHS);
              break;
 
-           case 0x52:          /* Store Word, WriteBack, Pre Dec, Immed */
+           case 0x52:          /* Store Word, WriteBack, Pre Dec, Immed */
              UNDEF_LSRBaseEQDestWb;
              UNDEF_LSRPCBaseWb;
              temp = LHS - LSImmRHS;
@@ -2405,7 +2641,7 @@ check_PMUintr:
                LSBase = temp;
              break;
 
-           case 0x53:          /* Load Word, WriteBack, Pre Dec, Immed */
+           case 0x53:          /* Load Word, WriteBack, Pre Dec, Immed */
              UNDEF_LSRBaseEQDestWb;
              UNDEF_LSRPCBaseWb;
              temp = LHS - LSImmRHS;
@@ -2413,15 +2649,15 @@ check_PMUintr:
                LSBase = temp;
              break;
 
-           case 0x54:          /* Store Byte, No WriteBack, Pre Dec, Immed */
+           case 0x54:          /* Store Byte, No WriteBack, Pre Dec, Immed */
              (void) StoreByte (state, instr, LHS - LSImmRHS);
              break;
 
-           case 0x55:          /* Load Byte, No WriteBack, Pre Dec, Immed */
+           case 0x55:          /* Load Byte, No WriteBack, Pre Dec, Immed */
              (void) LoadByte (state, instr, LHS - LSImmRHS, LUNSIGNED);
              break;
 
-           case 0x56:          /* Store Byte, WriteBack, Pre Dec, Immed */
+           case 0x56:          /* Store Byte, WriteBack, Pre Dec, Immed */
              UNDEF_LSRBaseEQDestWb;
              UNDEF_LSRPCBaseWb;
              temp = LHS - LSImmRHS;
@@ -2429,7 +2665,7 @@ check_PMUintr:
                LSBase = temp;
              break;
 
-           case 0x57:          /* Load Byte, WriteBack, Pre Dec, Immed */
+           case 0x57:          /* Load Byte, WriteBack, Pre Dec, Immed */
              UNDEF_LSRBaseEQDestWb;
              UNDEF_LSRPCBaseWb;
              temp = LHS - LSImmRHS;
@@ -2437,15 +2673,15 @@ check_PMUintr:
                LSBase = temp;
              break;
 
-           case 0x58:          /* Store Word, No WriteBack, Pre Inc, Immed */
+           case 0x58:          /* Store Word, No WriteBack, Pre Inc, Immed */
              (void) StoreWord (state, instr, LHS + LSImmRHS);
              break;
 
-           case 0x59:          /* Load Word, No WriteBack, Pre Inc, Immed */
+           case 0x59:          /* Load Word, No WriteBack, Pre Inc, Immed */
              (void) LoadWord (state, instr, LHS + LSImmRHS);
              break;
 
-           case 0x5a:          /* Store Word, WriteBack, Pre Inc, Immed */
+           case 0x5a:          /* Store Word, WriteBack, Pre Inc, Immed */
              UNDEF_LSRBaseEQDestWb;
              UNDEF_LSRPCBaseWb;
              temp = LHS + LSImmRHS;
@@ -2453,7 +2689,7 @@ check_PMUintr:
                LSBase = temp;
              break;
 
-           case 0x5b:          /* Load Word, WriteBack, Pre Inc, Immed */
+           case 0x5b:          /* Load Word, WriteBack, Pre Inc, Immed */
              UNDEF_LSRBaseEQDestWb;
              UNDEF_LSRPCBaseWb;
              temp = LHS + LSImmRHS;
@@ -2461,15 +2697,15 @@ check_PMUintr:
                LSBase = temp;
              break;
 
-           case 0x5c:          /* Store Byte, No WriteBack, Pre Inc, Immed */
+           case 0x5c:          /* Store Byte, No WriteBack, Pre Inc, Immed */
              (void) StoreByte (state, instr, LHS + LSImmRHS);
              break;
 
-           case 0x5d:          /* Load Byte, No WriteBack, Pre Inc, Immed */
+           case 0x5d:          /* Load Byte, No WriteBack, Pre Inc, Immed */
              (void) LoadByte (state, instr, LHS + LSImmRHS, LUNSIGNED);
              break;
 
-           case 0x5e:          /* Store Byte, WriteBack, Pre Inc, Immed */
+           case 0x5e:          /* Store Byte, WriteBack, Pre Inc, Immed */
              UNDEF_LSRBaseEQDestWb;
              UNDEF_LSRPCBaseWb;
              temp = LHS + LSImmRHS;
@@ -2477,7 +2713,7 @@ check_PMUintr:
                LSBase = temp;
              break;
 
-           case 0x5f:          /* Load Byte, WriteBack, Pre Inc, Immed */
+           case 0x5f:          /* Load Byte, WriteBack, Pre Inc, Immed */
              UNDEF_LSRBaseEQDestWb;
              UNDEF_LSRPCBaseWb;
              temp = LHS + LSImmRHS;
@@ -2488,7 +2724,7 @@ check_PMUintr:
 
              /* Single Data Transfer Register RHS Instructions.  */
 
-           case 0x60:          /* Store Word, No WriteBack, Post Dec, Reg */
+           case 0x60:          /* Store Word, No WriteBack, Post Dec, Reg */
              if (BIT (4))
                {
                  ARMul_UndefInstr (state, instr);
@@ -2503,9 +2739,14 @@ check_PMUintr:
                LSBase = lhs - LSRegRHS;
              break;
 
-           case 0x61:          /* Load Word, No WriteBack, Post Dec, Reg */
+           case 0x61:          /* Load Word, No WriteBack, Post Dec, Reg */
              if (BIT (4))
                {
+#ifdef MODE32
+                 if (state->is_v6
+                     && handle_v6_insn (state, instr))
+                   break;
+#endif
                  ARMul_UndefInstr (state, instr);
                  break;
                }
@@ -2519,9 +2760,14 @@ check_PMUintr:
                LSBase = temp;
              break;
 
-           case 0x62:          /* Store Word, WriteBack, Post Dec, Reg */
+           case 0x62:          /* Store Word, WriteBack, Post Dec, Reg */
              if (BIT (4))
                {
+#ifdef MODE32
+                 if (state->is_v6
+                     && handle_v6_insn (state, instr))
+                   break;
+#endif
                  ARMul_UndefInstr (state, instr);
                  break;
                }
@@ -2536,9 +2782,14 @@ check_PMUintr:
              state->NtransSig = (state->Mode & 3) ? HIGH : LOW;
              break;
 
-           case 0x63:          /* Load Word, WriteBack, Post Dec, Reg */
+           case 0x63:          /* Load Word, WriteBack, Post Dec, Reg */
              if (BIT (4))
                {
+#ifdef MODE32
+                 if (state->is_v6
+                     && handle_v6_insn (state, instr))
+                   break;
+#endif
                  ARMul_UndefInstr (state, instr);
                  break;
                }
@@ -2554,7 +2805,7 @@ check_PMUintr:
              state->NtransSig = (state->Mode & 3) ? HIGH : LOW;
              break;
 
-           case 0x64:          /* Store Byte, No WriteBack, Post Dec, Reg */
+           case 0x64:          /* Store Byte, No WriteBack, Post Dec, Reg */
              if (BIT (4))
                {
                  ARMul_UndefInstr (state, instr);
@@ -2569,9 +2820,14 @@ check_PMUintr:
                LSBase = lhs - LSRegRHS;
              break;
 
-           case 0x65:          /* Load Byte, No WriteBack, Post Dec, Reg */
+           case 0x65:          /* Load Byte, No WriteBack, Post Dec, Reg */
              if (BIT (4))
                {
+#ifdef MODE32
+                 if (state->is_v6
+                     && handle_v6_insn (state, instr))
+                   break;
+#endif
                  ARMul_UndefInstr (state, instr);
                  break;
                }
@@ -2585,9 +2841,14 @@ check_PMUintr:
                LSBase = temp;
              break;
 
-           case 0x66:          /* Store Byte, WriteBack, Post Dec, Reg */
+           case 0x66:          /* Store Byte, WriteBack, Post Dec, Reg */
              if (BIT (4))
                {
+#ifdef MODE32
+                 if (state->is_v6
+                     && handle_v6_insn (state, instr))
+                   break;
+#endif
                  ARMul_UndefInstr (state, instr);
                  break;
                }
@@ -2602,9 +2863,14 @@ check_PMUintr:
              state->NtransSig = (state->Mode & 3) ? HIGH : LOW;
              break;
 
-           case 0x67:          /* Load Byte, WriteBack, Post Dec, Reg */
+           case 0x67:          /* Load Byte, WriteBack, Post Dec, Reg */
              if (BIT (4))
                {
+#ifdef MODE32
+                 if (state->is_v6
+                     && handle_v6_insn (state, instr))
+                   break;
+#endif
                  ARMul_UndefInstr (state, instr);
                  break;
                }
@@ -2620,9 +2886,14 @@ check_PMUintr:
              state->NtransSig = (state->Mode & 3) ? HIGH : LOW;
              break;
 
-           case 0x68:          /* Store Word, No WriteBack, Post Inc, Reg */
+           case 0x68:          /* Store Word, No WriteBack, Post Inc, Reg */
              if (BIT (4))
                {
+#ifdef MODE32
+                 if (state->is_v6
+                     && handle_v6_insn (state, instr))
+                   break;
+#endif
                  ARMul_UndefInstr (state, instr);
                  break;
                }
@@ -2635,7 +2906,7 @@ check_PMUintr:
                LSBase = lhs + LSRegRHS;
              break;
 
-           case 0x69:          /* Load Word, No WriteBack, Post Inc, Reg */
+           case 0x69:          /* Load Word, No WriteBack, Post Inc, Reg */
              if (BIT (4))
                {
                  ARMul_UndefInstr (state, instr);
@@ -2651,9 +2922,14 @@ check_PMUintr:
                LSBase = temp;
              break;
 
-           case 0x6a:          /* Store Word, WriteBack, Post Inc, Reg */
+           case 0x6a:          /* Store Word, WriteBack, Post Inc, Reg */
              if (BIT (4))
                {
+#ifdef MODE32
+                 if (state->is_v6
+                     && handle_v6_insn (state, instr))
+                   break;
+#endif
                  ARMul_UndefInstr (state, instr);
                  break;
                }
@@ -2668,9 +2944,14 @@ check_PMUintr:
              state->NtransSig = (state->Mode & 3) ? HIGH : LOW;
              break;
 
-           case 0x6b:          /* Load Word, WriteBack, Post Inc, Reg */
+           case 0x6b:          /* Load Word, WriteBack, Post Inc, Reg */
              if (BIT (4))
                {
+#ifdef MODE32
+                 if (state->is_v6
+                     && handle_v6_insn (state, instr))
+                   break;
+#endif
                  ARMul_UndefInstr (state, instr);
                  break;
                }
@@ -2686,9 +2967,14 @@ check_PMUintr:
              state->NtransSig = (state->Mode & 3) ? HIGH : LOW;
              break;
 
-           case 0x6c:          /* Store Byte, No WriteBack, Post Inc, Reg */
+           case 0x6c:          /* Store Byte, No WriteBack, Post Inc, Reg */
              if (BIT (4))
                {
+#ifdef MODE32
+                 if (state->is_v6
+                     && handle_v6_insn (state, instr))
+                   break;
+#endif
                  ARMul_UndefInstr (state, instr);
                  break;
                }
@@ -2701,7 +2987,7 @@ check_PMUintr:
                LSBase = lhs + LSRegRHS;
              break;
 
-           case 0x6d:          /* Load Byte, No WriteBack, Post Inc, Reg */
+           case 0x6d:          /* Load Byte, No WriteBack, Post Inc, Reg */
              if (BIT (4))
                {
                  ARMul_UndefInstr (state, instr);
@@ -2717,9 +3003,14 @@ check_PMUintr:
                LSBase = temp;
              break;
 
-           case 0x6e:          /* Store Byte, WriteBack, Post Inc, Reg */
+           case 0x6e:          /* Store Byte, WriteBack, Post Inc, Reg */
              if (BIT (4))
                {
+#ifdef MODE32
+                 if (state->is_v6
+                     && handle_v6_insn (state, instr))
+                   break;
+#endif
                  ARMul_UndefInstr (state, instr);
                  break;
                }
@@ -2734,9 +3025,14 @@ check_PMUintr:
              state->NtransSig = (state->Mode & 3) ? HIGH : LOW;
              break;
 
-           case 0x6f:          /* Load Byte, WriteBack, Post Inc, Reg */
+           case 0x6f:          /* Load Byte, WriteBack, Post Inc, Reg */
              if (BIT (4))
                {
+#ifdef MODE32
+                 if (state->is_v6
+                     && handle_v6_insn (state, instr))
+                   break;
+#endif
                  ARMul_UndefInstr (state, instr);
                  break;
                }
@@ -2753,16 +3049,21 @@ check_PMUintr:
              break;
 
 
-           case 0x70:          /* Store Word, No WriteBack, Pre Dec, Reg */
+           case 0x70:          /* Store Word, No WriteBack, Pre Dec, Reg */
              if (BIT (4))
                {
+#ifdef MODE32
+                 if (state->is_v6
+                     && handle_v6_insn (state, instr))
+                   break;
+#endif
                  ARMul_UndefInstr (state, instr);
                  break;
                }
              (void) StoreWord (state, instr, LHS - LSRegRHS);
              break;
 
-           case 0x71:          /* Load Word, No WriteBack, Pre Dec, Reg */
+           case 0x71:          /* Load Word, No WriteBack, Pre Dec, Reg */
              if (BIT (4))
                {
                  ARMul_UndefInstr (state, instr);
@@ -2771,7 +3072,7 @@ check_PMUintr:
              (void) LoadWord (state, instr, LHS - LSRegRHS);
              break;
 
-           case 0x72:          /* Store Word, WriteBack, Pre Dec, Reg */
+           case 0x72:          /* Store Word, WriteBack, Pre Dec, Reg */
              if (BIT (4))
                {
                  ARMul_UndefInstr (state, instr);
@@ -2786,7 +3087,7 @@ check_PMUintr:
                LSBase = temp;
              break;
 
-           case 0x73:          /* Load Word, WriteBack, Pre Dec, Reg */
+           case 0x73:          /* Load Word, WriteBack, Pre Dec, Reg */
              if (BIT (4))
                {
                  ARMul_UndefInstr (state, instr);
@@ -2801,25 +3102,35 @@ check_PMUintr:
                LSBase = temp;
              break;
 
-           case 0x74:          /* Store Byte, No WriteBack, Pre Dec, Reg */
+           case 0x74:          /* Store Byte, No WriteBack, Pre Dec, Reg */
              if (BIT (4))
                {
+#ifdef MODE32
+                 if (state->is_v6
+                     && handle_v6_insn (state, instr))
+                   break;
+#endif
                  ARMul_UndefInstr (state, instr);
                  break;
                }
              (void) StoreByte (state, instr, LHS - LSRegRHS);
              break;
 
-           case 0x75:          /* Load Byte, No WriteBack, Pre Dec, Reg */
+           case 0x75:          /* Load Byte, No WriteBack, Pre Dec, Reg */
              if (BIT (4))
                {
+#ifdef MODE32
+                 if (state->is_v6
+                     && handle_v6_insn (state, instr))
+                   break;
+#endif
                  ARMul_UndefInstr (state, instr);
                  break;
                }
              (void) LoadByte (state, instr, LHS - LSRegRHS, LUNSIGNED);
              break;
 
-           case 0x76:          /* Store Byte, WriteBack, Pre Dec, Reg */
+           case 0x76:          /* Store Byte, WriteBack, Pre Dec, Reg */
              if (BIT (4))
                {
                  ARMul_UndefInstr (state, instr);
@@ -2834,7 +3145,7 @@ check_PMUintr:
                LSBase = temp;
              break;
 
-           case 0x77:          /* Load Byte, WriteBack, Pre Dec, Reg */
+           case 0x77:          /* Load Byte, WriteBack, Pre Dec, Reg */
              if (BIT (4))
                {
                  ARMul_UndefInstr (state, instr);
@@ -2849,16 +3160,21 @@ check_PMUintr:
                LSBase = temp;
              break;
 
-           case 0x78:          /* Store Word, No WriteBack, Pre Inc, Reg */
+           case 0x78:          /* Store Word, No WriteBack, Pre Inc, Reg */
              if (BIT (4))
                {
+#ifdef MODE32
+                 if (state->is_v6
+                     && handle_v6_insn (state, instr))
+                   break;
+#endif
                  ARMul_UndefInstr (state, instr);
                  break;
                }
              (void) StoreWord (state, instr, LHS + LSRegRHS);
              break;
 
-           case 0x79:          /* Load Word, No WriteBack, Pre Inc, Reg */
+           case 0x79:          /* Load Word, No WriteBack, Pre Inc, Reg */
              if (BIT (4))
                {
                  ARMul_UndefInstr (state, instr);
@@ -2867,9 +3183,14 @@ check_PMUintr:
              (void) LoadWord (state, instr, LHS + LSRegRHS);
              break;
 
-           case 0x7a:          /* Store Word, WriteBack, Pre Inc, Reg */
+           case 0x7a:          /* Store Word, WriteBack, Pre Inc, Reg */
              if (BIT (4))
                {
+#ifdef MODE32
+                 if (state->is_v6
+                     && handle_v6_insn (state, instr))
+                   break;
+#endif
                  ARMul_UndefInstr (state, instr);
                  break;
                }
@@ -2882,7 +3203,7 @@ check_PMUintr:
                LSBase = temp;
              break;
 
-           case 0x7b:          /* Load Word, WriteBack, Pre Inc, Reg */
+           case 0x7b:          /* Load Word, WriteBack, Pre Inc, Reg */
              if (BIT (4))
                {
                  ARMul_UndefInstr (state, instr);
@@ -2897,16 +3218,21 @@ check_PMUintr:
                LSBase = temp;
              break;
 
-           case 0x7c:          /* Store Byte, No WriteBack, Pre Inc, Reg */
+           case 0x7c:          /* Store Byte, No WriteBack, Pre Inc, Reg */
              if (BIT (4))
                {
+#ifdef MODE32
+                 if (state->is_v6
+                     && handle_v6_insn (state, instr))
+                   break;
+#endif
                  ARMul_UndefInstr (state, instr);
                  break;
                }
              (void) StoreByte (state, instr, LHS + LSRegRHS);
              break;
 
-           case 0x7d:          /* Load Byte, No WriteBack, Pre Inc, Reg */
+           case 0x7d:          /* Load Byte, No WriteBack, Pre Inc, Reg */
              if (BIT (4))
                {
                  ARMul_UndefInstr (state, instr);
@@ -2915,7 +3241,7 @@ check_PMUintr:
              (void) LoadByte (state, instr, LHS + LSRegRHS, LUNSIGNED);
              break;
 
-           case 0x7e:          /* Store Byte, WriteBack, Pre Inc, Reg */
+           case 0x7e:          /* Store Byte, WriteBack, Pre Inc, Reg */
              if (BIT (4))
                {
                  ARMul_UndefInstr (state, instr);
@@ -2930,7 +3256,7 @@ check_PMUintr:
                LSBase = temp;
              break;
 
-           case 0x7f:          /* Load Byte, WriteBack, Pre Inc, Reg */
+           case 0x7f:          /* Load Byte, WriteBack, Pre Inc, Reg */
              if (BIT (4))
                {
                  /* Check for the special breakpoint opcode.
@@ -2957,146 +3283,146 @@ check_PMUintr:
 
              /* Multiple Data Transfer Instructions.  */
 
-           case 0x80:          /* Store, No WriteBack, Post Dec */
+           case 0x80:          /* Store, No WriteBack, Post Dec */
              STOREMULT (instr, LSBase - LSMNumRegs + 4L, 0L);
              break;
 
-           case 0x81:          /* Load, No WriteBack, Post Dec */
+           case 0x81:          /* Load, No WriteBack, Post Dec */
              LOADMULT (instr, LSBase - LSMNumRegs + 4L, 0L);
              break;
 
-           case 0x82:          /* Store, WriteBack, Post Dec */
+           case 0x82:          /* Store, WriteBack, Post Dec */
              temp = LSBase - LSMNumRegs;
              STOREMULT (instr, temp + 4L, temp);
              break;
 
-           case 0x83:          /* Load, WriteBack, Post Dec */
+           case 0x83:          /* Load, WriteBack, Post Dec */
              temp = LSBase - LSMNumRegs;
              LOADMULT (instr, temp + 4L, temp);
              break;
 
-           case 0x84:          /* Store, Flags, No WriteBack, Post Dec */
+           case 0x84:          /* Store, Flags, No WriteBack, Post Dec */
              STORESMULT (instr, LSBase - LSMNumRegs + 4L, 0L);
              break;
 
-           case 0x85:          /* Load, Flags, No WriteBack, Post Dec */
+           case 0x85:          /* Load, Flags, No WriteBack, Post Dec */
              LOADSMULT (instr, LSBase - LSMNumRegs + 4L, 0L);
              break;
 
-           case 0x86:          /* Store, Flags, WriteBack, Post Dec */
+           case 0x86:          /* Store, Flags, WriteBack, Post Dec */
              temp = LSBase - LSMNumRegs;
              STORESMULT (instr, temp + 4L, temp);
              break;
 
-           case 0x87:          /* Load, Flags, WriteBack, Post Dec */
+           case 0x87:          /* Load, Flags, WriteBack, Post Dec */
              temp = LSBase - LSMNumRegs;
              LOADSMULT (instr, temp + 4L, temp);
              break;
 
-           case 0x88:          /* Store, No WriteBack, Post Inc */
+           case 0x88:          /* Store, No WriteBack, Post Inc */
              STOREMULT (instr, LSBase, 0L);
              break;
 
-           case 0x89:          /* Load, No WriteBack, Post Inc */
+           case 0x89:          /* Load, No WriteBack, Post Inc */
              LOADMULT (instr, LSBase, 0L);
              break;
 
-           case 0x8a:          /* Store, WriteBack, Post Inc */
+           case 0x8a:          /* Store, WriteBack, Post Inc */
              temp = LSBase;
              STOREMULT (instr, temp, temp + LSMNumRegs);
              break;
 
-           case 0x8b:          /* Load, WriteBack, Post Inc */
+           case 0x8b:          /* Load, WriteBack, Post Inc */
              temp = LSBase;
              LOADMULT (instr, temp, temp + LSMNumRegs);
              break;
 
-           case 0x8c:          /* Store, Flags, No WriteBack, Post Inc */
+           case 0x8c:          /* Store, Flags, No WriteBack, Post Inc */
              STORESMULT (instr, LSBase, 0L);
              break;
 
-           case 0x8d:          /* Load, Flags, No WriteBack, Post Inc */
+           case 0x8d:          /* Load, Flags, No WriteBack, Post Inc */
              LOADSMULT (instr, LSBase, 0L);
              break;
 
-           case 0x8e:          /* Store, Flags, WriteBack, Post Inc */
+           case 0x8e:          /* Store, Flags, WriteBack, Post Inc */
              temp = LSBase;
              STORESMULT (instr, temp, temp + LSMNumRegs);
              break;
 
-           case 0x8f:          /* Load, Flags, WriteBack, Post Inc */
+           case 0x8f:          /* Load, Flags, WriteBack, Post Inc */
              temp = LSBase;
              LOADSMULT (instr, temp, temp + LSMNumRegs);
              break;
 
-           case 0x90:          /* Store, No WriteBack, Pre Dec */
+           case 0x90:          /* Store, No WriteBack, Pre Dec */
              STOREMULT (instr, LSBase - LSMNumRegs, 0L);
              break;
 
-           case 0x91:          /* Load, No WriteBack, Pre Dec */
+           case 0x91:          /* Load, No WriteBack, Pre Dec */
              LOADMULT (instr, LSBase - LSMNumRegs, 0L);
              break;
 
-           case 0x92:          /* Store, WriteBack, Pre Dec */
+           case 0x92:          /* Store, WriteBack, Pre Dec */
              temp = LSBase - LSMNumRegs;
              STOREMULT (instr, temp, temp);
              break;
 
-           case 0x93:          /* Load, WriteBack, Pre Dec */
+           case 0x93:          /* Load, WriteBack, Pre Dec */
              temp = LSBase - LSMNumRegs;
              LOADMULT (instr, temp, temp);
              break;
 
-           case 0x94:          /* Store, Flags, No WriteBack, Pre Dec */
+           case 0x94:          /* Store, Flags, No WriteBack, Pre Dec */
              STORESMULT (instr, LSBase - LSMNumRegs, 0L);
              break;
 
-           case 0x95:          /* Load, Flags, No WriteBack, Pre Dec */
+           case 0x95:          /* Load, Flags, No WriteBack, Pre Dec */
              LOADSMULT (instr, LSBase - LSMNumRegs, 0L);
              break;
 
-           case 0x96:          /* Store, Flags, WriteBack, Pre Dec */
+           case 0x96:          /* Store, Flags, WriteBack, Pre Dec */
              temp = LSBase - LSMNumRegs;
              STORESMULT (instr, temp, temp);
              break;
 
-           case 0x97:          /* Load, Flags, WriteBack, Pre Dec */
+           case 0x97:          /* Load, Flags, WriteBack, Pre Dec */
              temp = LSBase - LSMNumRegs;
              LOADSMULT (instr, temp, temp);
              break;
 
-           case 0x98:          /* Store, No WriteBack, Pre Inc */
+           case 0x98:          /* Store, No WriteBack, Pre Inc */
              STOREMULT (instr, LSBase + 4L, 0L);
              break;
 
-           case 0x99:          /* Load, No WriteBack, Pre Inc */
+           case 0x99:          /* Load, No WriteBack, Pre Inc */
              LOADMULT (instr, LSBase + 4L, 0L);
              break;
 
-           case 0x9a:          /* Store, WriteBack, Pre Inc */
+           case 0x9a:          /* Store, WriteBack, Pre Inc */
              temp = LSBase;
              STOREMULT (instr, temp + 4L, temp + LSMNumRegs);
              break;
 
-           case 0x9b:          /* Load, WriteBack, Pre Inc */
+           case 0x9b:          /* Load, WriteBack, Pre Inc */
              temp = LSBase;
              LOADMULT (instr, temp + 4L, temp + LSMNumRegs);
              break;
 
-           case 0x9c:          /* Store, Flags, No WriteBack, Pre Inc */
+           case 0x9c:          /* Store, Flags, No WriteBack, Pre Inc */
              STORESMULT (instr, LSBase + 4L, 0L);
              break;
 
-           case 0x9d:          /* Load, Flags, No WriteBack, Pre Inc */
+           case 0x9d:          /* Load, Flags, No WriteBack, Pre Inc */
              LOADSMULT (instr, LSBase + 4L, 0L);
              break;
 
-           case 0x9e:          /* Store, Flags, WriteBack, Pre Inc */
+           case 0x9e:          /* Store, Flags, WriteBack, Pre Inc */
              temp = LSBase;
              STORESMULT (instr, temp + 4L, temp + LSMNumRegs);
              break;
 
-           case 0x9f:          /* Load, Flags, WriteBack, Pre Inc */
+           case 0x9f:          /* Load, Flags, WriteBack, Pre Inc */
              temp = LSBase;
              LOADSMULT (instr, temp + 4L, temp + LSMNumRegs);
              break;
@@ -3169,6 +3495,7 @@ check_PMUintr:
              FLUSHPIPE;
              break;
 
+
              /* Co-Processor Data Transfers.  */
            case 0xc4:
              if (state->is_v5)
@@ -3193,7 +3520,7 @@ check_PMUintr:
                        ARMul_UndefInstr (state, instr);
                      else
                        {
-                         /* XScale MAR insn.  Move two registers into accumulator.  */               
+                         /* XScale MAR insn.  Move two registers into accumulator.  */
                          state->Accumulator = state->Reg[BITS (12, 15)];
                          state->Accumulator += (ARMdword) state->Reg[BITS (16, 19)] << 32;
                        }
@@ -3205,7 +3532,7 @@ check_PMUintr:
                }
              /* Drop through.  */
              
-           case 0xc0:          /* Store , No WriteBack , Post Dec */
+           case 0xc0:          /* Store , No WriteBack , Post Dec */
              ARMul_STC (state, instr, LHS);
              break;
 
@@ -3250,91 +3577,91 @@ check_PMUintr:
                }
              /* Drop through.  */
 
-           case 0xc1:          /* Load , No WriteBack , Post Dec */
+           case 0xc1:          /* Load , No WriteBack , Post Dec */
              ARMul_LDC (state, instr, LHS);
              break;
 
            case 0xc2:
-           case 0xc6:          /* Store , WriteBack , Post Dec */
+           case 0xc6:          /* Store , WriteBack , Post Dec */
              lhs = LHS;
              state->Base = lhs - LSCOff;
              ARMul_STC (state, instr, lhs);
              break;
 
            case 0xc3:
-           case 0xc7:          /* Load , WriteBack , Post Dec */
+           case 0xc7:          /* Load , WriteBack , Post Dec */
              lhs = LHS;
              state->Base = lhs - LSCOff;
              ARMul_LDC (state, instr, lhs);
              break;
 
            case 0xc8:
-           case 0xcc:          /* Store , No WriteBack , Post Inc */
+           case 0xcc:          /* Store , No WriteBack , Post Inc */
              ARMul_STC (state, instr, LHS);
              break;
 
            case 0xc9:
-           case 0xcd:          /* Load , No WriteBack , Post Inc */
+           case 0xcd:          /* Load , No WriteBack , Post Inc */
              ARMul_LDC (state, instr, LHS);
              break;
 
            case 0xca:
-           case 0xce:          /* Store , WriteBack , Post Inc */
+           case 0xce:          /* Store , WriteBack , Post Inc */
              lhs = LHS;
              state->Base = lhs + LSCOff;
              ARMul_STC (state, instr, LHS);
              break;
 
            case 0xcb:
-           case 0xcf:          /* Load , WriteBack , Post Inc */
+           case 0xcf:          /* Load , WriteBack , Post Inc */
              lhs = LHS;
              state->Base = lhs + LSCOff;
              ARMul_LDC (state, instr, LHS);
              break;
 
            case 0xd0:
-           case 0xd4:          /* Store , No WriteBack , Pre Dec */
+           case 0xd4:          /* Store , No WriteBack , Pre Dec */
              ARMul_STC (state, instr, LHS - LSCOff);
              break;
 
            case 0xd1:
-           case 0xd5:          /* Load , No WriteBack , Pre Dec */
+           case 0xd5:          /* Load , No WriteBack , Pre Dec */
              ARMul_LDC (state, instr, LHS - LSCOff);
              break;
 
            case 0xd2:
-           case 0xd6:          /* Store , WriteBack , Pre Dec */
+           case 0xd6:          /* Store , WriteBack , Pre Dec */
              lhs = LHS - LSCOff;
              state->Base = lhs;
              ARMul_STC (state, instr, lhs);
              break;
 
            case 0xd3:
-           case 0xd7:          /* Load , WriteBack , Pre Dec */
+           case 0xd7:          /* Load , WriteBack , Pre Dec */
              lhs = LHS - LSCOff;
              state->Base = lhs;
              ARMul_LDC (state, instr, lhs);
              break;
 
            case 0xd8:
-           case 0xdc:          /* Store , No WriteBack , Pre Inc */
+           case 0xdc:          /* Store , No WriteBack , Pre Inc */
              ARMul_STC (state, instr, LHS + LSCOff);
              break;
 
            case 0xd9:
-           case 0xdd:          /* Load , No WriteBack , Pre Inc */
+           case 0xdd:          /* Load , No WriteBack , Pre Inc */
              ARMul_LDC (state, instr, LHS + LSCOff);
              break;
 
            case 0xda:
-           case 0xde:          /* Store , WriteBack , Pre Inc */
+           case 0xde:          /* Store , WriteBack , Pre Inc */
              lhs = LHS + LSCOff;
              state->Base = lhs;
              ARMul_STC (state, instr, lhs);
              break;
 
            case 0xdb:
-           case 0xdf:          /* Load , WriteBack , Pre Inc */
+           case 0xdf:          /* Load , WriteBack , Pre Inc */
              lhs = LHS + LSCOff;
              state->Base = lhs;
              ARMul_LDC (state, instr, lhs);
@@ -3342,6 +3669,7 @@ check_PMUintr:
 
 
              /* Co-Processor Register Transfers (MCR) and Data Ops.  */
+
            case 0xe2:
              if (! CP_ACCESS_ALLOWED (state, CPNum))
                {
@@ -3352,78 +3680,84 @@ check_PMUintr:
                switch (BITS (18, 19))
                  {
                  case 0x0:
-                   {
-                     /* XScale MIA instruction.  Signed multiplication of two 32 bit
-                        values and addition to 40 bit accumulator.  */
-                     long long Rm = state->Reg[MULLHSReg];
-                     long long Rs = state->Reg[MULACCReg];
-
-                     if (Rm & (1 << 31))
-                       Rm -= 1ULL << 32;
-                     if (Rs & (1 << 31))
-                       Rs -= 1ULL << 32;
-                     state->Accumulator += Rm * Rs;
-                   }
-                   goto donext;
+                   if (BITS (4, 11) == 1 && BITS (16, 17) == 0)
+                     {
+                       /* XScale MIA instruction.  Signed multiplication of
+                          two 32 bit values and addition to 40 bit accumulator.  */
+                       ARMsdword Rm = state->Reg[MULLHSReg];
+                       ARMsdword Rs = state->Reg[MULACCReg];
+
+                       if (Rm & (1 << 31))
+                         Rm -= 1ULL << 32;
+                       if (Rs & (1 << 31))
+                         Rs -= 1ULL << 32;
+                       state->Accumulator += Rm * Rs;
+                       goto donext;
+                     }
+                   break;
 
                  case 0x2:
-                   {
-                     /* XScale MIAPH instruction.  */
-                     ARMword t1 = state->Reg[MULLHSReg] >> 16;
-                     ARMword t2 = state->Reg[MULACCReg] >> 16;
-                     ARMword t3 = state->Reg[MULLHSReg] & 0xffff;
-                     ARMword t4 = state->Reg[MULACCReg] & 0xffff;
-                     long long t5;
-
-                     if (t1 & (1 << 15))
-                       t1 -= 1 << 16;
-                     if (t2 & (1 << 15))
-                       t2 -= 1 << 16;
-                     if (t3 & (1 << 15))
-                       t3 -= 1 << 16;
-                     if (t4 & (1 << 15))
-                       t4 -= 1 << 16;
-                     t1 *= t2;
-                     t5 = t1;
-                     if (t5 & (1 << 31))
-                       t5 -= 1ULL << 32;
-                     state->Accumulator += t5;
-                     t3 *= t4;
-                     t5 = t3;
-                     if (t5 & (1 << 31))
-                       t5 -= 1ULL << 32;
-                     state->Accumulator += t5;
-                   }
-                   goto donext;
+                   if (BITS (4, 11) == 1 && BITS (16, 17) == 0)
+                     {
+                       /* XScale MIAPH instruction.  */
+                       ARMword t1 = state->Reg[MULLHSReg] >> 16;
+                       ARMword t2 = state->Reg[MULACCReg] >> 16;
+                       ARMword t3 = state->Reg[MULLHSReg] & 0xffff;
+                       ARMword t4 = state->Reg[MULACCReg] & 0xffff;
+                       ARMsdword t5;
+
+                       if (t1 & (1 << 15))
+                         t1 -= 1 << 16;
+                       if (t2 & (1 << 15))
+                         t2 -= 1 << 16;
+                       if (t3 & (1 << 15))
+                         t3 -= 1 << 16;
+                       if (t4 & (1 << 15))
+                         t4 -= 1 << 16;
+                       t1 *= t2;
+                       t5 = t1;
+                       if (t5 & (1 << 31))
+                         t5 -= 1ULL << 32;
+                       state->Accumulator += t5;
+                       t3 *= t4;
+                       t5 = t3;
+                       if (t5 & (1 << 31))
+                         t5 -= 1ULL << 32;
+                       state->Accumulator += t5;
+                       goto donext;
+                     }
+                   break;
 
                  case 0x3:
-                   {
-                     /* XScale MIAxy instruction.  */
-                     ARMword t1;
-                     ARMword t2;
-                     long long t5;
-
-                     if (BIT (17))
-                       t1 = state->Reg[MULLHSReg] >> 16;
-                     else
-                       t1 = state->Reg[MULLHSReg] & 0xffff;
-
-                     if (BIT (16))
-                       t2 = state->Reg[MULACCReg] >> 16;
-                     else
-                       t2 = state->Reg[MULACCReg] & 0xffff;
-
-                     if (t1 & (1 << 15))
-                       t1 -= 1 << 16;
-                     if (t2 & (1 << 15))
-                       t2 -= 1 << 16;
-                     t1 *= t2;
-                     t5 = t1;
-                     if (t5 & (1 << 31))
-                       t5 -= 1ULL << 32;
-                     state->Accumulator += t5;
-                   }
-                   goto donext;
+                   if (BITS (4, 11) == 1)
+                     {
+                       /* XScale MIAxy instruction.  */
+                       ARMword t1;
+                       ARMword t2;
+                       ARMsdword t5;
+
+                       if (BIT (17))
+                         t1 = state->Reg[MULLHSReg] >> 16;
+                       else
+                         t1 = state->Reg[MULLHSReg] & 0xffff;
+
+                       if (BIT (16))
+                         t2 = state->Reg[MULACCReg] >> 16;
+                       else
+                         t2 = state->Reg[MULACCReg] & 0xffff;
+
+                       if (t1 & (1 << 15))
+                         t1 -= 1 << 16;
+                       if (t2 & (1 << 15))
+                         t2 -= 1 << 16;
+                       t1 *= t2;
+                       t5 = t1;
+                       if (t5 & (1 << 31))
+                         t5 -= 1ULL << 32;
+                       state->Accumulator += t5;
+                       goto donext;
+                     }
+                   break;
 
                  default:
                    break;
@@ -3438,7 +3772,8 @@ check_PMUintr:
            case 0xec:
            case 0xee:
              if (BIT (4))
-               {               /* MCR */
+               {
+                 /* MCR.  */
                  if (DESTReg == 15)
                    {
                      UNDEF_MCRPC;
@@ -3452,7 +3787,8 @@ check_PMUintr:
                  else
                    ARMul_MCR (state, instr, DEST);
                }
-             else              /* CDP Part 1 */
+             else
+               /* CDP Part 1.  */
                ARMul_CDP (state, instr);
              break;
 
@@ -3467,7 +3803,8 @@ check_PMUintr:
            case 0xed:
            case 0xef:
              if (BIT (4))
-               {               /* MRC */
+               {
+                 /* MRC */
                  temp = ARMul_MRC (state, instr);
                  if (DESTReg == 15)
                    {
@@ -3479,12 +3816,13 @@ check_PMUintr:
                  else
                    DEST = temp;
                }
-             else              /* CDP Part 2 */
+             else
+               /* CDP Part 2.  */
                ARMul_CDP (state, instr);
              break;
 
 
-             /*  SWI instruction.  */
+             /* SWI instruction.  */
            case 0xf0:
            case 0xf1:
            case 0xf2:
@@ -3521,10 +3859,10 @@ check_PMUintr:
 #endif
 
 #ifdef NEED_UI_LOOP_HOOK
-      if (ui_loop_hook != NULL && ui_loop_hook_counter-- < 0)
+      if (deprecated_ui_loop_hook != NULL && ui_loop_hook_counter-- < 0)
        {
          ui_loop_hook_counter = UI_LOOP_POLL_INTERVAL;
-         ui_loop_hook (0);
+         deprecated_ui_loop_hook (0);
        }
 #endif /* NEED_UI_LOOP_HOOK */
 
@@ -3588,9 +3926,9 @@ GetDPRegRHS (ARMul_State * state, ARMword instr)
          if (shamt == 0)
            return (base);
          else if (shamt >= 32)
-           return ((ARMword) ((long int) base >> 31L));
+           return ((ARMword) ((ARMsword) base >> 31L));
          else
-           return ((ARMword) ((long int) base >> (int) shamt));
+           return ((ARMword) ((ARMsword) base >> (int) shamt));
        case ROR:
          shamt &= 0x1f;
          if (shamt == 0)
@@ -3620,17 +3958,18 @@ GetDPRegRHS (ARMul_State * state, ARMword instr)
            return (base >> shamt);
        case ASR:
          if (shamt == 0)
-           return ((ARMword) ((long int) base >> 31L));
+           return ((ARMword) ((ARMsword) base >> 31L));
          else
-           return ((ARMword) ((long int) base >> (int) shamt));
+           return ((ARMword) ((ARMsword) base >> (int) shamt));
        case ROR:
-         if (shamt == 0)       /* its an RRX */
+         if (shamt == 0)
+           /* It's an RRX.  */
            return ((base >> 1) | (CFLAG << 31));
          else
            return ((base << (32 - shamt)) | (base >> shamt));
        }
     }
-  
+
   return 0;
 }
 
@@ -3702,12 +4041,12 @@ GetDPSRegRHS (ARMul_State * state, ARMword instr)
          else if (shamt >= 32)
            {
              ASSIGNC (base >> 31L);
-             return ((ARMword) ((long int) base >> 31L));
+             return ((ARMword) ((ARMsword) base >> 31L));
            }
          else
            {
-             ASSIGNC ((ARMword) ((long int) base >> (int) (shamt - 1)) & 1);
-             return ((ARMword) ((long int) base >> (int) shamt));
+             ASSIGNC ((ARMword) ((ARMsword) base >> (int) (shamt - 1)) & 1);
+             return ((ARMword) ((ARMsword) base >> (int) shamt));
            }
        case ROR:
          if (shamt == 0)
@@ -3735,6 +4074,7 @@ GetDPSRegRHS (ARMul_State * state, ARMword instr)
 #endif
        base = state->Reg[base];
       shamt = BITS (7, 11);
+
       switch ((int) BITS (5, 6))
        {
        case LSL:
@@ -3755,16 +4095,17 @@ GetDPSRegRHS (ARMul_State * state, ARMword instr)
          if (shamt == 0)
            {
              ASSIGNC (base >> 31L);
-             return ((ARMword) ((long int) base >> 31L));
+             return ((ARMword) ((ARMsword) base >> 31L));
            }
          else
            {
-             ASSIGNC ((ARMword) ((long int) base >> (int) (shamt - 1)) & 1);
-             return ((ARMword) ((long int) base >> (int) shamt));
+             ASSIGNC ((ARMword) ((ARMsword) base >> (int) (shamt - 1)) & 1);
+             return ((ARMword) ((ARMsword) base >> (int) shamt));
            }
        case ROR:
          if (shamt == 0)
-           {                   /* its an RRX */
+           {
+             /* It's an RRX.  */
              shamt = CFLAG;
              ASSIGNC (base & 1);
              return ((base >> 1) | (shamt << 31));
@@ -3796,12 +4137,14 @@ WriteR15 (ARMul_State * state, ARMword src)
   else
 #endif
     src &= 0xfffffffc;
+
 #ifdef MODE32
   state->Reg[15] = src & PCBITS;
 #else
   state->Reg[15] = (src & R15PCBITS) | ECC | ER15INT | EMODE;
   ARMul_R15Altered (state);
 #endif
+
   FLUSHPIPE;
 }
 
@@ -3826,14 +4169,17 @@ WriteSR15 (ARMul_State * state, ARMword src)
 #else
 #ifdef MODET
   if (TFLAG)
-    abort (); /* ARMul_R15Altered would have to support it.  */
+    /* ARMul_R15Altered would have to support it.  */
+    abort ();
   else
 #endif
     src &= 0xfffffffc;
+
   if (state->Bank == USERBANK)
     state->Reg[15] = (src & (CCBITS | R15PCBITS)) | ER15INT | EMODE;
   else
     state->Reg[15] = src;
+
   ARMul_R15Altered (state);
 #endif
   FLUSHPIPE;
@@ -3875,7 +4221,8 @@ GetLSRegRHS (ARMul_State * state, ARMword instr)
   base = RHSReg;
 #ifndef MODE32
   if (base == 15)
-    base = ECC | ER15INT | R15PC | EMODE;      /* Now forbidden, but ....  */
+    /* Now forbidden, but ...  */
+    base = ECC | ER15INT | R15PC | EMODE;
   else
 #endif
     base = state->Reg[base];
@@ -3892,11 +4239,12 @@ GetLSRegRHS (ARMul_State * state, ARMword instr)
        return (base >> shamt);
     case ASR:
       if (shamt == 0)
-       return ((ARMword) ((long int) base >> 31L));
+       return ((ARMword) ((ARMsword) base >> 31L));
       else
-       return ((ARMword) ((long int) base >> (int) shamt));
+       return ((ARMword) ((ARMsword) base >> (int) shamt));
     case ROR:
-      if (shamt == 0)          /* its an RRX */
+      if (shamt == 0)
+       /* It's an RRX.  */
        return ((base >> 1) | (CFLAG << 31));
       else
        return ((base << (32 - shamt)) | (base >> shamt));
@@ -3916,12 +4264,13 @@ GetLS7RHS (ARMul_State * state, ARMword instr)
       /* Register.  */
 #ifndef MODE32
       if (RHSReg == 15)
-       return ECC | ER15INT | R15PC | EMODE;   /* Now forbidden, but ...  */
+       /* Now forbidden, but ...  */
+       return ECC | ER15INT | R15PC | EMODE;
 #endif
       return state->Reg[RHSReg];
     }
 
-  /* Otherwise an immediate.  */
+  /* Immediate.  */
   return BITS (0, 3) | (BITS (8, 11) << 4);
 }
 
@@ -3943,7 +4292,7 @@ LoadWord (ARMul_State * state, ARMword instr, ARMword address)
   if (state->Aborted)
     {
       TAKEABORT;
-      return (state->lateabtSig);
+      return state->lateabtSig;
     }
   if (address & 3)
     dest = ARMul_Align (state, address, dest);
@@ -3965,22 +4314,19 @@ LoadHalfWord (ARMul_State * state, ARMword instr, ARMword address,
   BUSUSEDINCPCS;
 #ifndef MODE32
   if (ADDREXCEPT (address))
-    {
-      INTERNALABORT (address);
-    }
+    INTERNALABORT (address);
 #endif
   dest = ARMul_LoadHalfWord (state, address);
   if (state->Aborted)
     {
       TAKEABORT;
-      return (state->lateabtSig);
+      return state->lateabtSig;
     }
   UNDEF_LSRBPC;
   if (signextend)
-    {
-      if (dest & 1 << (16 - 1))
-       dest = (dest & ((1 << 16) - 1)) - (1 << 16);
-    }
+    if (dest & 1 << (16 - 1))
+      dest = (dest & ((1 << 16) - 1)) - (1 << 16);
+
   WRITEDEST (dest);
   ARMul_Icycles (state, 1, 0L);
   return (DESTReg != LHSReg);
@@ -3998,24 +4344,22 @@ LoadByte (ARMul_State * state, ARMword instr, ARMword address, int signextend)
   BUSUSEDINCPCS;
 #ifndef MODE32
   if (ADDREXCEPT (address))
-    {
-      INTERNALABORT (address);
-    }
+    INTERNALABORT (address);
 #endif
   dest = ARMul_LoadByte (state, address);
   if (state->Aborted)
     {
       TAKEABORT;
-      return (state->lateabtSig);
+      return state->lateabtSig;
     }
   UNDEF_LSRBPC;
   if (signextend)
-    {
-      if (dest & 1 << (8 - 1))
-       dest = (dest & ((1 << 8) - 1)) - (1 << 8);
-    }
+    if (dest & 1 << (8 - 1))
+      dest = (dest & ((1 << 8) - 1)) - (1 << 8);
+
   WRITEDEST (dest);
   ARMul_Icycles (state, 1, 0L);
+
   return (DESTReg != LHSReg);
 }
 
@@ -4288,7 +4632,6 @@ StoreHalfWord (ARMul_State * state, ARMword instr, ARMword address)
       TAKEABORT;
       return state->lateabtSig;
     }
-
   return TRUE;
 }
 
@@ -4318,7 +4661,7 @@ StoreByte (ARMul_State * state, ARMword instr, ARMword address)
   if (state->Aborted)
     {
       TAKEABORT;
-      return (state->lateabtSig);
+      return state->lateabtSig;
     }
   UNDEF_LSRBPC;
   return TRUE;
@@ -4327,7 +4670,7 @@ StoreByte (ARMul_State * state, ARMword instr, ARMword address)
 /* This function does the work of loading the registers listed in an LDM
    instruction, when the S bit is clear.  The code here is always increment
    after, it's up to the caller to get the input address correct and to
-   handle base register modification.a  */
+   handle base register modification.  */
 
 static void
 LoadMult (ARMul_State * state, ARMword instr, ARMword address, ARMword WBBase)
@@ -4345,8 +4688,9 @@ LoadMult (ARMul_State * state, ARMword instr, ARMword address, ARMword WBBase)
   if (BIT (21) && LHSReg != 15)
     LSBase = WBBase;
 
+  /* N cycle first.  */
   for (temp = 0; !BIT (temp); temp++)
-    ;  /* N cycle first */
+    ;
 
   dest = ARMul_LoadWordN (state, address);
 
@@ -4358,9 +4702,11 @@ LoadMult (ARMul_State * state, ARMword instr, ARMword address, ARMword WBBase)
       state->Aborted = ARMul_DataAbortV;
     }
 
-  for (; temp < 16; temp++)    /* S cycles from here on */
+  /* S cycles from here on.  */
+  for (; temp < 16; temp ++)
     if (BIT (temp))
-      {                                /* load this register */
+      {
+       /* Load this register.  */
        address += 4;
        dest = ARMul_LoadWordS (state, address);
 
@@ -4422,8 +4768,9 @@ LoadSMult (ARMul_State * state,
       UNDEF_LSMUserBankWb;
     }
 
+  /* N cycle first.  */
   for (temp = 0; !BIT (temp); temp ++)
-    ;  /* N cycle first.  */
+    ;
 
   dest = ARMul_LoadWordN (state, address);
 
@@ -4431,12 +4778,12 @@ LoadSMult (ARMul_State * state,
     state->Reg[temp++] = dest;
   else if (!state->Aborted)
     {
-      XScale_set_fsr_far(state, ARMul_CP15_R5_ST_ALIGN, address);
+      XScale_set_fsr_far (state, ARMul_CP15_R5_ST_ALIGN, address);
       state->Aborted = ARMul_DataAbortV;
     }
 
+  /* S cycles from here on.  */
   for (; temp < 16; temp++)
-    /* S cycles from here on.  */
     if (BIT (temp))
       {
        /* Load this register.  */
@@ -4447,7 +4794,7 @@ LoadSMult (ARMul_State * state,
          state->Reg[temp] = dest;
        else if (!state->Aborted)
          {
-            XScale_set_fsr_far(state, ARMul_CP15_R5_ST_ALIGN, address);
+            XScale_set_fsr_far (state, ARMul_CP15_R5_ST_ALIGN, address);
            state->Aborted = ARMul_DataAbortV;
          }
       }
@@ -4501,8 +4848,10 @@ LoadSMult (ARMul_State * state,
    handle base register modification.  */
 
 static void
-StoreMult (ARMul_State * state, ARMword instr,
-          ARMword address, ARMword WBBase)
+StoreMult (ARMul_State * state,
+          ARMword instr,
+          ARMword address,
+          ARMword WBBase)
 {
   ARMword temp;
 
@@ -4522,8 +4871,9 @@ StoreMult (ARMul_State * state, ARMword instr,
     PATCHR15;
 #endif
 
-  for (temp = 0; !BIT (temp); temp++)
-    ;  /* N cycle first.  */
+  /* N cycle first.  */
+  for (temp = 0; !BIT (temp); temp ++)
+    ;
 
 #ifdef MODE32
   ARMul_StoreWordN (state, address, state->Reg[temp++]);
@@ -4540,6 +4890,7 @@ StoreMult (ARMul_State * state, ARMword instr,
            address += 4;
            (void) ARMul_LoadWordS (state, address);
          }
+
       if (BIT (21) && LHSReg != 15)
        LSBase = WBBase;
       TAKEABORT;
@@ -4551,14 +4902,15 @@ StoreMult (ARMul_State * state, ARMword instr,
 
   if (state->abortSig && !state->Aborted)
     {
-      XScale_set_fsr_far(state, ARMul_CP15_R5_ST_ALIGN, address);
+      XScale_set_fsr_far (state, ARMul_CP15_R5_ST_ALIGN, address);
       state->Aborted = ARMul_DataAbortV;
     }
 
   if (BIT (21) && LHSReg != 15)
     LSBase = WBBase;
 
-  for (; temp < 16; temp++)    /* S cycles from here on */
+  /* S cycles from here on.  */
+  for (; temp < 16; temp ++)
     if (BIT (temp))
       {
        /* Save this register.  */
@@ -4568,7 +4920,7 @@ StoreMult (ARMul_State * state, ARMword instr,
 
        if (state->abortSig && !state->Aborted)
          {
-            XScale_set_fsr_far(state, ARMul_CP15_R5_ST_ALIGN, address);
+            XScale_set_fsr_far (state, ARMul_CP15_R5_ST_ALIGN, address);
            state->Aborted = ARMul_DataAbortV;
          }
       }
@@ -4635,7 +4987,6 @@ StoreSMult (ARMul_State * state,
        LSBase = WBBase;
 
       TAKEABORT;
-
       return;
     }
   else
@@ -4644,12 +4995,12 @@ StoreSMult (ARMul_State * state,
 
   if (state->abortSig && !state->Aborted)
     {
-      XScale_set_fsr_far(state, ARMul_CP15_R5_ST_ALIGN, address);
+      XScale_set_fsr_far (state, ARMul_CP15_R5_ST_ALIGN, address);
       state->Aborted = ARMul_DataAbortV;
     }
 
+  /* S cycles from here on.  */
   for (; temp < 16; temp++)
-    /* S cycles from here on.  */
     if (BIT (temp))
       {
        /* Save this register.  */
@@ -4659,7 +5010,7 @@ StoreSMult (ARMul_State * state,
 
        if (state->abortSig && !state->Aborted)
          {
-            XScale_set_fsr_far(state, ARMul_CP15_R5_ST_ALIGN, address);
+            XScale_set_fsr_far (state, ARMul_CP15_R5_ST_ALIGN, address);
            state->Aborted = ARMul_DataAbortV;
          }
       }
@@ -4686,13 +5037,13 @@ Add32 (ARMword a1, ARMword a2, int *carry)
   unsigned int ua1 = (unsigned int) a1;
 
   /* If (result == RdLo) and (state->Reg[nRdLo] == 0),
-     or (result > RdLo) then we have no carry: */
+     or (result > RdLo) then we have no carry */
   if ((uresult == ua1) ? (a2 != 0) : (uresult < ua1))
     *carry = 1;
   else
     *carry = 0;
 
-  return (result);
+  return result;
 }
 
 /* This function does the work of multiplying
@@ -4733,13 +5084,12 @@ Multiply64 (ARMul_State * state, ARMword instr, int msigned, int scc)
       if (msigned)
        {
          /* Compute sign of result and adjust operands if necessary.  */
-
          sign = (Rm ^ Rs) & 0x80000000;
 
-         if (((signed long) Rm) < 0)
+         if (((ARMsword) Rm) < 0)
            Rm = -Rm;
 
-         if (((signed long) Rs) < 0)
+         if (((ARMsword) Rs) < 0)
            Rs = -Rs;
        }
 
@@ -4761,7 +5111,6 @@ Multiply64 (ARMul_State * state, ARMword instr, int msigned, int scc)
       if (sign)
        {
          /* Negate result if necessary.  */
-
          RdLo = ~RdLo;
          RdHi = ~RdHi;
          if (RdLo == 0xFFFFFFFF)
@@ -4772,7 +5121,6 @@ Multiply64 (ARMul_State * state, ARMword instr, int msigned, int scc)
          else
            RdLo += 1;
        }
-      /* Else undefined result.  */
 
       state->Reg[nRdLo] = RdLo;
       state->Reg[nRdHi] = RdHi;
@@ -4781,11 +5129,9 @@ Multiply64 (ARMul_State * state, ARMword instr, int msigned, int scc)
     fprintf (stderr, "sim: MULTIPLY64 - INVALID ARGUMENTS\n");
 
   if (scc)
-    {
-      /* Ensure that both RdHi and RdLo are used to compute Z,
-        but don't let RdLo's sign bit make it to N.  */
-      ARMul_NegZero (state, RdHi | (RdLo >> 16) | (RdLo & 0xFFFF));
-    }
+    /* Ensure that both RdHi and RdLo are used to compute Z,
+       but don't let RdLo's sign bit make it to N.  */
+    ARMul_NegZero (state, RdHi | (RdLo >> 16) | (RdLo & 0xFFFF));
 
   /* The cycle count depends on whether the instruction is a signed or
      unsigned multiply, and what bits are clear in the multiplier.  */
This page took 0.133914 seconds and 4 git commands to generate.