ARM: Add a base class for 32 bit thumb data processing immediate instructions.
authorGabe Black <gblack@eecs.umich.edu>
Wed, 2 Jun 2010 17:58:00 +0000 (12:58 -0500)
committerGabe Black <gblack@eecs.umich.edu>
Wed, 2 Jun 2010 17:58:00 +0000 (12:58 -0500)
src/arch/arm/insts/pred_inst.cc
src/arch/arm/insts/pred_inst.hh
src/arch/arm/isa/formats/pred.isa

index f98db1c8e1dccd4a721e4981e64e3e2a257191ee..b1b21677c988db6b621725a008b475fcef08b6e5 100644 (file)
@@ -1,4 +1,17 @@
-/* Copyright (c) 2007-2008 The Florida State University
+/*
+ * 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) 2007-2008 The Florida State University
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -40,7 +53,7 @@ PredIntOp::generateDisassembly(Addr pc, const SymbolTable *symtab) const
 }
 
 std::string
-PredImmOp::generateDisassembly(Addr pc, const SymbolTable *symtab) const
+PredImmOpBase::generateDisassembly(Addr pc, const SymbolTable *symtab) const
 {
     std::stringstream ss;
     printDataInst(ss, true);
index 76b5a4cff7b18ff4853e930a0ba6ca145ae22c03..817ed44f54bb35bcb5d5da375d59d886daaf59f7 100644 (file)
@@ -1,4 +1,17 @@
-/* Copyright (c) 2007-2008 The Florida State University
+/*
+ * 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) 2007-2008 The Florida State University
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -61,27 +74,65 @@ class PredOp : public ArmStaticInst
 /**
  * Base class for predicated immediate operations.
  */
-class PredImmOp : public PredOp
+class PredImmOpBase : public PredOp
 {
     protected:
 
     uint32_t imm;
-    uint32_t rotate;
     uint32_t rotated_imm;
     uint32_t rotated_carry;
 
+    /// Constructor
+    PredImmOpBase(const char *mnem, ExtMachInst _machInst, OpClass __opClass) :
+                  PredOp(mnem, _machInst, __opClass),
+                  imm(machInst.imm), rotated_imm(0), rotated_carry(0)
+    {
+    }
+
+    std::string generateDisassembly(Addr pc, const SymbolTable *symtab) const;
+};
+
+/**
+ * Base class for regular predicated immediate operations.
+ */
+class PredImmOp : public PredImmOpBase
+{
+    protected:
+
+    uint32_t rotate;
+
     /// Constructor
     PredImmOp(const char *mnem, ExtMachInst _machInst, OpClass __opClass) :
-              PredOp(mnem, _machInst, __opClass),
-              imm(machInst.imm), rotate(machInst.rotate << 1),
-              rotated_imm(0), rotated_carry(0)
+              PredImmOpBase(mnem, _machInst, __opClass),
+              rotate(machInst.rotate << 1)
     {
         rotated_imm = rotate_imm(imm, rotate);
         if (rotate != 0)
-            rotated_carry = (rotated_imm >> 31) & 1;
+            rotated_carry = bits(rotated_imm, 31);
     }
+};
 
-    std::string generateDisassembly(Addr pc, const SymbolTable *symtab) const;
+/**
+ * Base class for modified predicated immediate operations.
+ */
+class PredModImmOp : public PredImmOpBase
+{
+    protected:
+
+    uint8_t ctrlImm;
+    uint8_t dataImm;
+
+
+    /// Constructor
+    PredModImmOp(const char *mnem, ExtMachInst _machInst, OpClass __opClass) :
+                 PredImmOpBase(mnem, _machInst, __opClass),
+                 ctrlImm(bits(machInst.instBits, 26) << 3 |
+                         bits(machInst.instBits, 14, 12)),
+                 dataImm(bits(machInst.instBits, 7, 0))
+    {
+        rotated_imm = modified_imm(ctrlImm, dataImm);
+        rotated_carry = bits(rotated_imm, 31);
+    }
 };
 
 /**
index 0d6ee32f7d11e35427389376b8f0f6027a647439..03eb3a492ff30c8e0a03826e23f082a61705e184 100644 (file)
@@ -1,5 +1,17 @@
 // -*- mode:c++ -*-
 
+// 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) 2007-2008 The Florida State University
 // All rights reserved.
 //
@@ -165,6 +177,9 @@ let {{
         elif flagtype == "rsb":
             icValue = 'findCarry(32, resTemp, rotated_imm, ~Rn)'
             ivValue = 'findOverflow(32, resTemp, rotated_imm, ~Rn)'
+        elif flagtype == "modImm":
+            icValue = 'rotated_carry'
+            ivValue = 'CondCodes<28:>'
         else:
             icValue = '(rotate ? rotated_carry:CondCodes<29:>)'
             ivValue = 'CondCodes<28:>'
@@ -223,6 +238,23 @@ def format DataImmOp(code, flagtype = logic) {{
     decode_block = DataImmDecode.subst(iop)
 }};
 
+def format DataModImmOp(code, flagtype = modImm) {{
+    code += "resTemp = resTemp;"
+    iop = InstObjParams(name, Name + "ModImm", 'PredModImmOp',
+                        {"code": code,
+                         "predicate_test": predicateTest})
+    ccIop = InstObjParams(name, Name + "ModImmCc", 'PredModImmOp',
+                          {"code": code + getImmCcCode(flagtype),
+                           "predicate_test": predicateTest})
+    header_output = BasicDeclare.subst(iop) + \
+                    BasicDeclare.subst(ccIop)
+    decoder_output = BasicConstructor.subst(iop) + \
+                     BasicConstructor.subst(ccIop)
+    exec_output = PredOpExecute.subst(iop) + \
+                  PredOpExecute.subst(ccIop)
+    decode_block = DataImmDecode.subst(iop)
+}};
+
 def format PredOp(code, *opt_flags) {{
     iop = InstObjParams(name, Name, 'PredOp',
                         {"code": code,