ARM: Make a base class for instructions that use only an immediate.
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/misc.cc
src/arch/arm/insts/misc.hh
src/arch/arm/isa/templates/misc.isa

index a63bad690ced36e4eb1d2f65e8c54bade54d3374..87d3d1796057fd579bd5eb9052cfa32e830efd4a 100644 (file)
@@ -143,6 +143,15 @@ MsrRegOp::generateDisassembly(Addr pc, const SymbolTable *symtab) const
     return ss.str();
 }
 
+std::string
+ImmOp::generateDisassembly(Addr pc, const SymbolTable *symtab) const
+{
+    std::stringstream ss;
+    printMnemonic(ss);
+    ccprintf(ss, "#%d", imm);
+    return ss.str();
+}
+
 std::string
 RegRegOp::generateDisassembly(Addr pc, const SymbolTable *symtab) const
 {
index 23f777c2d73fb8fce445133d3b2185eb32ff7ba4..8080c4e1fd4744cc3d457d0316134f19a1431cb5 100644 (file)
@@ -94,6 +94,19 @@ class MsrRegOp : public MsrBase
     std::string generateDisassembly(Addr pc, const SymbolTable *symtab) const;
 };
 
+class ImmOp : public PredOp
+{
+  protected:
+    uint32_t imm;
+
+    ImmOp(const char *mnem, ExtMachInst _machInst, OpClass __opClass,
+             uint32_t _imm) :
+        PredOp(mnem, _machInst, __opClass), imm(_imm)
+    {}
+
+    std::string generateDisassembly(Addr pc, const SymbolTable *symtab) const;
+};
+
 class RegRegOp : public PredOp
 {
   protected:
index 2a6a4f51051bcce11a4a7d33b39d51d4887e1642..771b6d784db3ccba0a3596a818ac9ac8658832ac 100644 (file)
@@ -99,6 +99,25 @@ def template MsrImmConstructor {{
     }
 }};
 
+def template ImmOpDeclare {{
+class %(class_name)s : public %(base_class)s
+{
+  protected:
+    public:
+        // Constructor
+        %(class_name)s(ExtMachInst machInst, uint32_t _imm);
+        %(BasicExecDeclare)s
+};
+}};
+
+def template ImmOpConstructor {{
+    inline %(class_name)s::%(class_name)s(ExtMachInst machInst, uint32_t _imm)
+        : %(base_class)s("%(mnemonic)s", machInst, %(op_class)s, _imm)
+    {
+        %(constructor)s;
+    }
+}};
+
 def template RegRegOpDeclare {{
 class %(class_name)s : public %(base_class)s
 {