ARM: Tune up predicated instruction decoding.
authorGabe Black <gblack@eecs.umich.edu>
Thu, 9 Jul 2009 06:02:19 +0000 (23:02 -0700)
committerGabe Black <gblack@eecs.umich.edu>
Thu, 9 Jul 2009 06:02:19 +0000 (23:02 -0700)
src/arch/arm/insts/pred_inst.cc
src/arch/arm/insts/pred_inst.hh
src/arch/arm/insts/static_inst.cc
src/arch/arm/insts/static_inst.hh

index 539cfc2d2212cf61eb42eef8ecb12e6f5acf7699..f98db1c8e1dccd4a721e4981e64e3e2a257191ee 100644 (file)
 namespace ArmISA
 {
 std::string
-PredOp::generateDisassembly(Addr pc, const SymbolTable *symtab) const
+PredIntOp::generateDisassembly(Addr pc, const SymbolTable *symtab) const
 {
     std::stringstream ss;
-    printDataInst(ss);
+    printDataInst(ss, false);
+    return ss.str();
+}
+
+std::string
+PredImmOp::generateDisassembly(Addr pc, const SymbolTable *symtab) const
+{
+    std::stringstream ss;
+    printDataInst(ss, true);
     return ss.str();
 }
 
index 38ac69358231947ff3688a715e6ef4f629d7a2a7..6f9bd9dc29b71142ba5c3fbfdb0fb048943681be 100644 (file)
@@ -56,8 +56,6 @@ class PredOp : public ArmStaticInst
            condCode((ConditionCode)(unsigned)machInst.condCode)
     {
     }
-
-    std::string generateDisassembly(Addr pc, const SymbolTable *symtab) const;
 };
 
 /**
@@ -65,23 +63,25 @@ class PredOp : public ArmStaticInst
  */
 class PredImmOp : public PredOp
 {
-        protected:
-
-        uint32_t imm;
-        uint32_t rotate;
-        uint32_t rotated_imm;
-        uint32_t rotated_carry;
-
-        /// Constructor
-        PredImmOp(const char *mnem, MachInst _machInst, OpClass __opClass) :
-                  PredOp(mnem, _machInst, __opClass),
-                  imm(machInst.imm), rotate(machInst.rotate << 1),
-                  rotated_imm(0), rotated_carry(0)
-        {
-            rotated_imm = rotate_imm(imm, rotate);
-            if (rotate != 0)
-                rotated_carry = (rotated_imm >> 31) & 1;
-        }
+    protected:
+
+    uint32_t imm;
+    uint32_t rotate;
+    uint32_t rotated_imm;
+    uint32_t rotated_carry;
+
+    /// Constructor
+    PredImmOp(const char *mnem, MachInst _machInst, OpClass __opClass) :
+              PredOp(mnem, _machInst, __opClass),
+              imm(machInst.imm), rotate(machInst.rotate << 1),
+              rotated_imm(0), rotated_carry(0)
+    {
+        rotated_imm = rotate_imm(imm, rotate);
+        if (rotate != 0)
+            rotated_carry = (rotated_imm >> 31) & 1;
+    }
+
+    std::string generateDisassembly(Addr pc, const SymbolTable *symtab) const;
 };
 
 /**
@@ -89,17 +89,19 @@ class PredImmOp : public PredOp
  */
 class PredIntOp : public PredOp
 {
-        protected:
+    protected:
 
-        uint32_t shift_size;
-        uint32_t shift;
+    uint32_t shift_size;
+    uint32_t shift;
 
-        /// Constructor
-        PredIntOp(const char *mnem, MachInst _machInst, OpClass __opClass) :
-                  PredOp(mnem, _machInst, __opClass),
-                  shift_size(machInst.shiftSize), shift(machInst.shift)
-        {
-        }
+    /// Constructor
+    PredIntOp(const char *mnem, MachInst _machInst, OpClass __opClass) :
+              PredOp(mnem, _machInst, __opClass),
+              shift_size(machInst.shiftSize), shift(machInst.shift)
+    {
+    }
+
+    std::string generateDisassembly(Addr pc, const SymbolTable *symtab) const;
 };
 
 /**
@@ -107,36 +109,36 @@ class PredIntOp : public PredOp
  */
 class PredMacroOp : public PredOp
 {
-        protected:
-
-        uint32_t numMicroops;
-        StaticInstPtr * microOps;
-
-        /// Constructor
-        PredMacroOp(const char *mnem, MachInst _machInst, OpClass __opClass) :
-                    PredOp(mnem, _machInst, __opClass),
-                    numMicroops(0)
-        {
-            // We rely on the subclasses of this object to handle the
-            // initialization of the micro-operations, since they are
-            // all of variable length
-            flags[IsMacroop] = true;
-        }
-
-        ~PredMacroOp()
-        {
-            if (numMicroops)
-                delete [] microOps;
-        }
-
-        StaticInstPtr
-        fetchMicroop(MicroPC microPC)
-        {
-            assert(microPC < numMicroops);
-            return microOps[microPC];
-        }
-
-        std::string generateDisassembly(Addr pc, const SymbolTable *symtab) const;
+    protected:
+
+    uint32_t numMicroops;
+    StaticInstPtr * microOps;
+
+    /// Constructor
+    PredMacroOp(const char *mnem, MachInst _machInst, OpClass __opClass) :
+                PredOp(mnem, _machInst, __opClass),
+                numMicroops(0)
+    {
+        // We rely on the subclasses of this object to handle the
+        // initialization of the micro-operations, since they are
+        // all of variable length
+        flags[IsMacroop] = true;
+    }
+
+    ~PredMacroOp()
+    {
+        if (numMicroops)
+            delete [] microOps;
+    }
+
+    StaticInstPtr
+    fetchMicroop(MicroPC microPC)
+    {
+        assert(microPC < numMicroops);
+        return microOps[microPC];
+    }
+
+    std::string generateDisassembly(Addr pc, const SymbolTable *symtab) const;
 };
 
 /**
@@ -144,12 +146,12 @@ class PredMacroOp : public PredOp
  */
 class PredMicroop : public PredOp
 {
-        /// Constructor
-        PredMicroop(const char *mnem, MachInst _machInst, OpClass __opClass) :
-                    PredOp(mnem, _machInst, __opClass)
-        {
-            flags[IsMicroop] = true;
-        }
+    /// Constructor
+    PredMicroop(const char *mnem, MachInst _machInst, OpClass __opClass) :
+                PredOp(mnem, _machInst, __opClass)
+    {
+        flags[IsMicroop] = true;
+    }
 };
 }
 
index f3ad1127b9300a524df87f0e6c066026fdfabcd9..df2d5de251a2ec61de0a762b421636026599a336 100644 (file)
@@ -330,61 +330,52 @@ ArmStaticInst::printMemSymbol(std::ostream &os,
 void
 ArmStaticInst::printShiftOperand(std::ostream &os) const
 {
-    // Shifter operand
-    if (bits((uint32_t)machInst, 25)) {
-        // Immediate form
-        unsigned rotate = machInst.rotate * 2;
-        uint32_t imm = machInst.imm;
-        ccprintf(os, "#%#x", (imm << (32 - rotate)) | (imm >> rotate));
-    } else {
-        // Register form
-        printReg(os, machInst.rm);
+    printReg(os, machInst.rm);
 
-        bool immShift = (machInst.opcode4 == 0);
-        bool done = false;
-        unsigned shiftAmt = (machInst.shiftSize);
-        ArmShiftType type = (ArmShiftType)(uint32_t)machInst.shift;
+    bool immShift = (machInst.opcode4 == 0);
+    bool done = false;
+    unsigned shiftAmt = (machInst.shiftSize);
+    ArmShiftType type = (ArmShiftType)(uint32_t)machInst.shift;
 
-        if ((type == LSR || type == ASR) && immShift && shiftAmt == 0)
-            shiftAmt = 32;
+    if ((type == LSR || type == ASR) && immShift && shiftAmt == 0)
+        shiftAmt = 32;
 
-        switch (type) {
-          case LSL:
-            if (immShift && shiftAmt == 0) {
-                done = true;
-                break;
-            }
-            os << ", LSL";
-            break;
-          case LSR:
-            os << ", LSR";
-            break;
-          case ASR:
-            os << ", ASR";
-            break;
-          case ROR:
-            if (immShift && shiftAmt == 0) {
-                os << ", RRX";
-                done = true;
-                break;
-            }
-            os << ", ROR";
+    switch (type) {
+      case LSL:
+        if (immShift && shiftAmt == 0) {
+            done = true;
             break;
-          default:
-            panic("Tried to disassemble unrecognized shift type.\n");
         }
-        if (!done) {
-            os << " ";
-            if (immShift)
-                os << "#" << shiftAmt;
-            else
-                printReg(os, machInst.rs);
+        os << ", LSL";
+        break;
+      case LSR:
+        os << ", LSR";
+        break;
+      case ASR:
+        os << ", ASR";
+        break;
+      case ROR:
+        if (immShift && shiftAmt == 0) {
+            os << ", RRX";
+            done = true;
+            break;
         }
+        os << ", ROR";
+        break;
+      default:
+        panic("Tried to disassemble unrecognized shift type.\n");
+    }
+    if (!done) {
+        os << " ";
+        if (immShift)
+            os << "#" << shiftAmt;
+        else
+            printReg(os, machInst.rs);
     }
 }
 
 void
-ArmStaticInst::printDataInst(std::ostream &os) const
+ArmStaticInst::printDataInst(std::ostream &os, bool withImm) const
 {
     printMnemonic(os, machInst.sField ? "s" : "");
     //XXX It would be nice if the decoder figured this all out for us.
@@ -409,7 +400,13 @@ ArmStaticInst::printDataInst(std::ostream &os) const
 
     if (!firstOp)
         os << ", ";
-    printShiftOperand(os);
+    if (withImm) {
+        unsigned rotate = machInst.rotate * 2;
+        uint32_t imm = machInst.imm;
+        ccprintf(os, "#%#x", (imm << (32 - rotate)) | (imm >> rotate));
+    } else {
+        printShiftOperand(os);
+    }
 }
 
 std::string
index 22b59791ce8a19a6e809ce0e5a4322aada05fc9c..c963c1827d08a0efbd54daa835c00d18df34a672 100644 (file)
@@ -71,7 +71,7 @@ class ArmStaticInst : public StaticInst
     void printShiftOperand(std::ostream &os) const;
 
 
-    void printDataInst(std::ostream &os) const;
+    void printDataInst(std::ostream &os, bool withImm) const;
 
     std::string generateDisassembly(Addr pc, const SymbolTable *symtab) const;
 };