ARM: Clean up condCodes in IT blocks.
authorAli Saidi <Ali.Saidi@ARM.com>
Wed, 21 Mar 2012 15:34:06 +0000 (10:34 -0500)
committerAli Saidi <Ali.Saidi@ARM.com>
Wed, 21 Mar 2012 15:34:06 +0000 (10:34 -0500)
src/arch/arm/insts/branch.hh
src/arch/arm/isa/formats/branch.isa
src/arch/arm/isa/formats/data.isa

index 0e33a92146367397029e066ebfc23acc6761a4f7..cc320dbff81391e6dd5b7f82ed091be8d0929d0e 100644 (file)
@@ -63,16 +63,15 @@ class BranchImm : public PredOp
 // Conditionally Branch to a target computed with an immediate
 class BranchImmCond : public BranchImm
 {
-  protected:
-    // This will mask the condition code stored for PredOp. Ideally these two
-    // class would cooperate, but they're not set up to do that at the moment.
-    ConditionCode condCode;
-
   public:
     BranchImmCond(const char *mnem, ExtMachInst _machInst, OpClass __opClass,
                   int32_t _imm, ConditionCode _condCode) :
-        BranchImm(mnem, _machInst, __opClass, _imm), condCode(_condCode)
-    {}
+        BranchImm(mnem, _machInst, __opClass, _imm)
+    {
+        // Only update if this isn't part of an IT block
+        if (!machInst.itstateMask)
+            condCode = _condCode;
+    }
 };
 
 // Branch to a target computed with a register
@@ -91,16 +90,15 @@ class BranchReg : public PredOp
 // Conditionally Branch to a target computed with a register
 class BranchRegCond : public BranchReg
 {
-  protected:
-    // This will mask the condition code stored for PredOp. Ideally these two
-    // class would cooperate, but they're not set up to do that at the moment.
-    ConditionCode condCode;
-
   public:
     BranchRegCond(const char *mnem, ExtMachInst _machInst, OpClass __opClass,
                   IntRegIndex _op1, ConditionCode _condCode) :
-        BranchReg(mnem, _machInst, __opClass, _op1), condCode(_condCode)
-    {}
+        BranchReg(mnem, _machInst, __opClass, _op1)
+    {
+        // Only update if this isn't part of an IT block
+        if (!machInst.itstateMask)
+            condCode = _condCode;
+    }
 };
 
 // Branch to a target computed with two registers
index fccfe2897bd7b15e5b95c469c2445ae389681a22..f1b17ec905898fa84f2d6ae61a4927d0e8d1fde6 100644 (file)
@@ -236,13 +236,6 @@ def format Thumb32BranchesAndMiscCtrl() {{
             }
           case 0x1:
             {
-                ConditionCode condCode;
-                if(machInst.itstateMask) {
-                  condCode = (ConditionCode)(uint8_t)machInst.itstateCond;
-                } else {
-                  condCode = COND_UC;
-                }
-
                 const uint32_t s = bits(machInst, 26);
                 const uint32_t i1 = !(bits(machInst, 13) ^ s);
                 const uint32_t i2 = !(bits(machInst, 11) ^ s);
@@ -251,19 +244,13 @@ def format Thumb32BranchesAndMiscCtrl() {{
                 const int32_t imm = sext<25>((s << 24) |
                                              (i1 << 23) | (i2 << 22) |
                                              (imm10 << 12) | (imm11 << 1));
-                return new B(machInst, imm, condCode);
+                return new B(machInst, imm, COND_UC);
             }
           case 0x4:
             {
                 if (bits(machInst, 0) == 1) {
                     return new Unknown(machInst);
                 }
-                ConditionCode condCode;
-                if(machInst.itstateMask) {
-                  condCode = (ConditionCode)(uint8_t)machInst.itstateCond;
-                } else {
-                  condCode = COND_UC;
-                }
                 const uint32_t s = bits(machInst, 26);
                 const uint32_t i1 = !(bits(machInst, 13) ^ s);
                 const uint32_t i2 = !(bits(machInst, 11) ^ s);
@@ -272,16 +259,10 @@ def format Thumb32BranchesAndMiscCtrl() {{
                 const int32_t imm = sext<25>((s << 24) |
                                              (i1 << 23) | (i2 << 22) |
                                              (imm10h << 12) | (imm10l << 2));
-                return new BlxImm(machInst, imm, condCode);
+                return new BlxImm(machInst, imm, COND_UC);
             }
           case 0x5:
             {
-                ConditionCode condCode;
-                if(machInst.itstateMask) {
-                  condCode = (ConditionCode)(uint8_t)machInst.itstateCond;
-                } else {
-                  condCode = COND_UC;
-                }
                 const uint32_t s = bits(machInst, 26);
                 const uint32_t i1 = !(bits(machInst, 13) ^ s);
                 const uint32_t i2 = !(bits(machInst, 11) ^ s);
@@ -290,7 +271,7 @@ def format Thumb32BranchesAndMiscCtrl() {{
                 const int32_t imm = sext<25>((s << 24) |
                                              (i1 << 23) | (i2 << 22) |
                                              (imm10 << 12) | (imm11 << 1));
-                return new Bl(machInst, imm, condCode);
+                return new Bl(machInst, imm, COND_UC);
             }
           default:
             break;
index ffe5f45e3b3e4b19af6788a7ed4185156c202ee2..3ee178f0e9689e03d56b7a4b818285af522341d6 100644 (file)
@@ -1040,25 +1040,13 @@ def format Thumb16SpecDataAndBx() {{
             return new MovReg(machInst, rdn, INTREG_ZERO, rm, 0, LSL);
           case 0x3:
             if (bits(machInst, 7) == 0) {
-                ConditionCode condCode;
-                if(machInst.itstateMask) {
-                  condCode = (ConditionCode)(uint8_t)machInst.itstateCond;
-                } else {
-                  condCode = COND_UC;
-                }
                 return new BxReg(machInst,
                                  (IntRegIndex)(uint32_t)bits(machInst, 6, 3),
-                                 condCode);
+                                 COND_UC);
             } else {
-                ConditionCode condCode;
-                if(machInst.itstateMask) {
-                  condCode = (ConditionCode)(uint8_t)machInst.itstateCond;
-                } else {
-                  condCode = COND_UC;
-                }
                 return new BlxReg(machInst,
                                   (IntRegIndex)(uint32_t)bits(machInst, 6, 3),
-                                  condCode);
+                                  COND_UC);
             }
         }
     }