ARM: Add a base class for SRS.
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/mem.cc
src/arch/arm/insts/mem.hh
src/arch/arm/isa/templates/mem.isa

index 394c159d144980df511ce050b6414c5f891bba97..eb16e42d02018e5a8de8461b16f21233ece07759 100644 (file)
@@ -87,6 +87,61 @@ RfeOp::generateDisassembly(Addr pc, const SymbolTable *symtab) const
     return ss.str();
 }
 
+string
+SrsOp::generateDisassembly(Addr pc, const SymbolTable *symtab) const
+{
+    stringstream ss;
+    switch (mode) {
+      case DecrementAfter:
+        printMnemonic(ss, "da");
+        break;
+      case DecrementBefore:
+        printMnemonic(ss, "db");
+        break;
+      case IncrementAfter:
+        printMnemonic(ss, "ia");
+        break;
+      case IncrementBefore:
+        printMnemonic(ss, "ib");
+        break;
+    }
+    printReg(ss, INTREG_SP);
+    if (wb) {
+        ss << "!";
+    }
+    ss << ", #";
+    switch (mode) {
+      case MODE_USER:
+        ss << "user";
+        break;
+      case MODE_FIQ:
+        ss << "fiq";
+        break;
+      case MODE_IRQ:
+        ss << "irq";
+        break;
+      case MODE_SVC:
+        ss << "supervisor";
+        break;
+      case MODE_MON:
+        ss << "monitor";
+        break;
+      case MODE_ABORT:
+        ss << "abort";
+        break;
+      case MODE_UNDEFINED:
+        ss << "undefined";
+        break;
+      case MODE_SYSTEM:
+        ss << "system";
+        break;
+      default:
+        ss << "unrecognized";
+        break;
+    }
+    return ss.str();
+}
+
 void
 Memory::printInst(std::ostream &os, AddrMode addrMode) const
 {
index ae3437120b93554d4e95c2a45b70384689e25c1d..50f718b9995ed5c80d83bb372733191d3b0b304b 100644 (file)
@@ -87,6 +87,30 @@ class RfeOp : public PredOp
     std::string generateDisassembly(Addr pc, const SymbolTable *symtab) const;
 };
 
+// The address is a base register plus an immediate.
+class SrsOp : public PredOp
+{
+  public:
+    enum AddrMode {
+        DecrementAfter,
+        DecrementBefore,
+        IncrementAfter,
+        IncrementBefore
+    };
+  protected:
+    uint32_t regMode;
+    AddrMode mode;
+    bool wb;
+
+    SrsOp(const char *mnem, ExtMachInst _machInst, OpClass __opClass,
+          uint32_t _regMode, AddrMode _mode, bool _wb)
+        : PredOp(mnem, _machInst, __opClass),
+          regMode(_regMode), mode(_mode), wb(_wb)
+    {}
+
+    std::string generateDisassembly(Addr pc, const SymbolTable *symtab) const;
+};
+
 class Memory : public PredOp
 {
   public:
index 7c93cd4eee03d8e2ed731d265cb63e8324271e0e..983d99af99f09eac74308265621af938610cfc08 100644 (file)
@@ -409,6 +409,26 @@ def template RfeDeclare {{
     };
 }};
 
+def template SrsDeclare {{
+    /**
+     * Static instruction class for "%(mnemonic)s".
+     */
+    class %(class_name)s : public %(base_class)s
+    {
+      public:
+
+        /// Constructor.
+        %(class_name)s(ExtMachInst machInst,
+                uint32_t _regMode, int _mode, bool _wb);
+
+        %(BasicExecDeclare)s
+
+        %(InitiateAccDeclare)s
+
+        %(CompleteAccDeclare)s
+    };
+}};
+
 def template SwapDeclare {{
     /**
      * Static instruction class for "%(mnemonic)s".
@@ -575,6 +595,16 @@ def template RfeConstructor {{
     }
 }};
 
+def template SrsConstructor {{
+    inline %(class_name)s::%(class_name)s(ExtMachInst machInst,
+            uint32_t _regMode, int _mode, bool _wb)
+         : %(base_class)s("%(mnemonic)s", machInst, %(op_class)s,
+                 (OperatingMode)_regMode, (AddrMode)_mode, _wb)
+    {
+        %(constructor)s;
+    }
+}};
+
 def template SwapConstructor {{
     inline %(class_name)s::%(class_name)s(ExtMachInst machInst,
             uint32_t _dest, uint32_t _op1, uint32_t _base)