ARM: Allow flattening into any mode.
authorGabe Black <gblack@eecs.umich.edu>
Wed, 2 Jun 2010 17:58:11 +0000 (12:58 -0500)
committerGabe Black <gblack@eecs.umich.edu>
Wed, 2 Jun 2010 17:58:11 +0000 (12:58 -0500)
src/arch/arm/insts/macromem.cc
src/arch/arm/intregs.hh
src/arch/arm/isa.hh
src/arch/arm/isa/operands.isa
src/arch/arm/registers.hh

index 5c4c2522ddb67ef7bd5e45213a99ff769c44b4d5..e5c3740894327d9aeee7734b7ae9def2cf2039ae 100644 (file)
@@ -101,7 +101,7 @@ MacroMemOp::MacroMemOp(const char *mnem, ExtMachInst machInst,
 
         unsigned regIdx = reg;
         if (force_user) {
-            regIdx = intRegForceUser(regIdx);
+            regIdx = intRegInMode(MODE_USER, regIdx);
         }
 
         if (load) {
index d13cca6dfab9c69650b2cb0184630d9a5129db9e..99ea9b7a627b709d1d23e728266dc2b1c854ed1e 100644 (file)
@@ -1,4 +1,16 @@
 /*
+ * Copyright (c) 2010 ARM Limited
+ * All rights reserved
+ *
+ * The license below extends only to copyright in the software and shall
+ * not be construed as granting a license to any other intellectual
+ * property including but not limited to intellectual property relating
+ * to a hardware implementation of the functionality of the software
+ * licensed hereunder.  You may use the software subject to the license
+ * terms below provided that you ensure that this notice is replicated
+ * unmodified and in its entirety in all distributions of the software,
+ * modified or unmodified, in source code or in binary form.
+ *
  * Copyright (c) 2009 The Regents of The University of Michigan
  * All rights reserved.
  *
@@ -33,6 +45,8 @@
 #ifndef __ARCH_ARM_INTREGS_HH__
 #define __ARCH_ARM_INTREGS_HH__
 
+#include "arch/arm/types.hh"
+
 namespace ArmISA
 {
 
@@ -322,12 +336,13 @@ INTREG_FIQ(unsigned index)
     return IntRegFiqMap[index];
 }
 
-static inline IntRegIndex
-intRegForceUser(unsigned index)
-{
-    assert(index < NUM_ARCH_INTREGS);
+static const unsigned intRegsPerMode = NUM_INTREGS;
 
-    return index == 15 ? (IntRegIndex)15 : (IntRegIndex)(index + NUM_INTREGS);
+static inline int
+intRegInMode(OperatingMode mode, int reg)
+{
+    assert(reg < NUM_ARCH_INTREGS);
+    return mode * intRegsPerMode + reg;
 }
 
 }
index a9c404351d1f4a2743704d399b074697efa2c8e9..a7bb1cc3ec547e36161fe9ff488e5cb4b5fcc453 100644 (file)
@@ -270,9 +270,27 @@ namespace ArmISA
             } else if (reg < NUM_INTREGS) {
                 return reg;
             } else {
-                reg -= NUM_INTREGS;
-                assert(reg < NUM_ARCH_INTREGS);
-                return reg;
+                int mode = reg / intRegsPerMode;
+                reg = reg % intRegsPerMode;
+                switch (mode) {
+                  case MODE_USER:
+                  case MODE_SYSTEM:
+                    return INTREG_USR(reg);
+                  case MODE_FIQ:
+                    return INTREG_FIQ(reg);
+                  case MODE_IRQ:
+                    return INTREG_IRQ(reg);
+                  case MODE_SVC:
+                    return INTREG_SVC(reg);
+                  case MODE_MON:
+                    return INTREG_MON(reg);
+                  case MODE_ABORT:
+                    return INTREG_ABT(reg);
+                  case MODE_UNDEFINED:
+                    return INTREG_UND(reg);
+                  default:
+                    panic("Flattening into an unknown mode.\n");
+                }
             }
         }
 
index 3fda93668cd4d804aa1aa8c913ba00e74143a33a..d99211b8927a0cf33137ba2947535149a2cec09a 100644 (file)
@@ -99,6 +99,9 @@ def operands {{
                maybePCRead, maybeIWPCWrite),
     'AIWDest': ('IntReg', 'uw', 'dest', 'IsInteger', 2,
                 maybePCRead, maybeAIWPCWrite),
+    'SpMode': ('IntReg', 'uw',
+               'intRegInMode((OperatingMode)regMode, INTREG_SP)',
+               'IsInteger', 2),
     'MiscDest': ('ControlReg', 'uw', 'dest', (None, None, 'IsControl'), 2),
     'Base': ('IntReg', 'uw', 'base', 'IsInteger', 0,
              maybeAlignedPCRead, maybePCWrite),
index ada8b50790fdcf1e17bea9de63aee62aa63f65dc..ac95f40911a816f7aface6ff3cc7979aea5fb9bb 100644 (file)
@@ -40,7 +40,7 @@ namespace ArmISA {
 using ArmISAInst::MaxInstSrcRegs;
 using ArmISAInst::MaxInstDestRegs;
 
-typedef uint8_t  RegIndex;
+typedef uint16_t  RegIndex;
 
 typedef uint64_t IntReg;