ARM: Add a base class for the RFE instruction.
authorGabe Black <gblack@eecs.umich.edu>
Wed, 2 Jun 2010 17:58:10 +0000 (12:58 -0500)
committerGabe Black <gblack@eecs.umich.edu>
Wed, 2 Jun 2010 17:58:10 +0000 (12:58 -0500)
src/arch/arm/insts/mem.cc
src/arch/arm/insts/mem.hh
src/arch/arm/isa/templates/mem.isa

index 521499847e7c119e5ed99ebd2bcac9f6c1136035..394c159d144980df511ce050b6414c5f891bba97 100644 (file)
@@ -62,6 +62,31 @@ Swap::generateDisassembly(Addr pc, const SymbolTable *symtab) const
     return ss.str();
 }
 
+string
+RfeOp::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, base);
+    if (wb) {
+        ss << "!";
+    }
+    return ss.str();
+}
+
 void
 Memory::printInst(std::ostream &os, AddrMode addrMode) const
 {
index dc4b7d6274b180dd02cbdc17c4467897fe5ad899..d5b5d35194c615c2e47724190c0154cf4260287a 100644 (file)
@@ -63,6 +63,30 @@ class Swap : public PredOp
     std::string generateDisassembly(Addr pc, const SymbolTable *symtab) const;
 };
 
+// The address is a base register plus an immediate.
+class RfeOp : public PredOp
+{
+  public:
+    enum AddrMode {
+        DecrementAfter,
+        DecrementBefore,
+        IncrementAfter,
+        IncrementBefore
+    };
+  protected:
+    IntRegIndex base;
+    AddrMode mode;
+    bool wb;
+
+    RfeOp(const char *mnem, ExtMachInst _machInst, OpClass __opClass,
+          IntRegIndex _base, AddrMode _mode, bool _wb)
+        : PredOp(mnem, _machInst, __opClass),
+          base(_base), mode(_mode), wb(_wb)
+    {}
+
+    std::string generateDisassembly(Addr pc, const SymbolTable *symtab) const;
+};
+
 class Memory : public PredOp
 {
   public:
index 6e76b07c193189715922636eed49208695579b79..e44fe41db9cc36c07004d2022e36e1cd721e50aa 100644 (file)
@@ -294,6 +294,26 @@ def template StoreCompleteAcc {{
     }
 }};
 
+def template RfeDeclare {{
+    /**
+     * Static instruction class for "%(mnemonic)s".
+     */
+    class %(class_name)s : public %(base_class)s
+    {
+      public:
+
+        /// Constructor.
+        %(class_name)s(ExtMachInst machInst,
+                uint32_t _base, int _mode, bool _wb);
+
+        %(BasicExecDeclare)s
+
+        %(InitiateAccDeclare)s
+
+        %(CompleteAccDeclare)s
+    };
+}};
+
 def template SwapDeclare {{
     /**
      * Static instruction class for "%(mnemonic)s".
@@ -408,6 +428,16 @@ def template CompleteAccDeclare {{
     Fault completeAcc(PacketPtr,  %(CPU_exec_context)s *, Trace::InstRecord *) const;
 }};
 
+def template RfeConstructor {{
+    inline %(class_name)s::%(class_name)s(ExtMachInst machInst,
+            uint32_t _base, int _mode, bool _wb)
+         : %(base_class)s("%(mnemonic)s", machInst, %(op_class)s,
+                 (IntRegIndex)_base, (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)