changeset dab0f29394f0 in /z/repo/gem5
details: http://repo.gem5.org/gem5?cmd=changeset;node=dab0f29394f0
description:
        ARM: Predict target of more instructions that modify PC.

diffstat:

 src/arch/arm/insts/macromem.cc      |   8 ++++++++
 src/arch/arm/isa/insts/data.isa     |  15 ++++++++++-----
 src/arch/arm/isa/templates/mem.isa  |  18 ++++++++++++++++++
 src/arch/arm/isa/templates/pred.isa |   9 +++++++++
 4 files changed, 45 insertions(+), 5 deletions(-)

diffs (126 lines):

diff -r 1f43ff3d9bc6 -r dab0f29394f0 src/arch/arm/insts/macromem.cc
--- a/src/arch/arm/insts/macromem.cc    Tue Sep 25 11:49:40 2012 -0500
+++ b/src/arch/arm/insts/macromem.cc    Tue Sep 25 11:49:40 2012 -0500
@@ -113,6 +113,14 @@
                 } else {
                     *++uop = new MicroLdrUop(machInst, regIdx,
                                             INTREG_UREG0, up, addr);
+                    if (reg == INTREG_PC) {
+                        (*uop)->setFlag(StaticInst::IsControl);
+                        if (!(condCode == COND_AL || condCode == COND_UC))
+                            (*uop)->setFlag(StaticInst::IsCondControl);
+                        else
+                            (*uop)->setFlag(StaticInst::IsUncondControl);
+                        (*uop)->setFlag(StaticInst::IsIndirectControl);
+                    }
                 }
             }
         } else {
diff -r 1f43ff3d9bc6 -r dab0f29394f0 src/arch/arm/isa/insts/data.isa
--- a/src/arch/arm/isa/insts/data.isa   Tue Sep 25 11:49:40 2012 -0500
+++ b/src/arch/arm/isa/insts/data.isa   Tue Sep 25 11:49:40 2012 -0500
@@ -116,7 +116,8 @@
     regRegOp2 = "shift_rm_rs(Op2, Shift<7:0>, shiftType, 0)"
 
     def buildImmDataInst(mnem, code, flagType = "logic", suffix = "Imm", \
-                         buildCc = True, buildNonCc = True, instFlags = []):
+                         buildCc = True, buildNonCc = True, isBranch = "0", \
+                         instFlags = []):
         cCode = carryCode[flagType]
         vCode = overflowCode[flagType]
         negBit = 31
@@ -133,10 +134,12 @@
         immCode = secondOpRe.sub(immOp2, code)
         immIop = InstObjParams(mnem, mnem.capitalize() + suffix, "DataImmOp",
                        {"code" : immCode,
+                        "is_branch" : isBranch,
                         "predicate_test": pickPredicate(immCode)}, instFlags)
         immIopCc = InstObjParams(mnem + "s", mnem.capitalize() + suffix + "Cc",
              "DataImmOp",
              {"code" : immCode + immCcCode,
+              "is_branch" : isBranch,
               "predicate_test": pickPredicate(immCode + immCcCode)}, instFlags)
 
         def subst(iop):
@@ -244,7 +247,7 @@
             if regRegAiw:
                 regRegCode = "AIW" + regRegCode
 
-        buildImmDataInst(mnem, instCode, flagType)
+        buildImmDataInst(mnem, instCode, flagType, isBranch = isBranch)
         buildRegDataInst(mnem, instCode, flagType,
                          isRasPop = isRasPop, isBranch = isBranch)
         buildRegRegDataInst(mnem, regRegCode, flagType)
@@ -276,13 +279,15 @@
 
     buildDataInst("and", "Dest = resTemp = Op1 & secondOp;")
     buildDataInst("eor", "Dest = resTemp = Op1 ^ secondOp;")
-    buildDataInst("sub", "Dest = resTemp = Op1 - secondOp;", "sub")
+    buildDataInst("sub", "Dest = resTemp = Op1 - secondOp;", "sub",
+                  isBranch = "dest == INTREG_PC")
     buildDataInst("rsb", "Dest = resTemp = secondOp - Op1;", "rsb")
-    buildDataInst("add", "Dest = resTemp = Op1 + secondOp;", "add")
+    buildDataInst("add", "Dest = resTemp = Op1 + secondOp;", "add",
+                  isBranch = "dest == INTREG_PC")
     buildImmDataInst("adr", '''
                                Dest = resTemp = (PC & ~0x3) +
                                (op1 ? secondOp : -secondOp);
-                            ''')
+                            ''', isBranch = "dest == INTREG_PC")
     buildDataInst("adc", "Dest = resTemp = Op1 + secondOp + %s;" % oldC, "add")
     buildDataInst("sbc", "Dest = resTemp = Op1 - secondOp - !%s;" % oldC, 
"sub")
     buildDataInst("rsc", "Dest = resTemp = secondOp - Op1 - !%s;" % oldC, 
"rsb")
diff -r 1f43ff3d9bc6 -r dab0f29394f0 src/arch/arm/isa/templates/mem.isa
--- a/src/arch/arm/isa/templates/mem.isa        Tue Sep 25 11:49:40 2012 -0500
+++ b/src/arch/arm/isa/templates/mem.isa        Tue Sep 25 11:49:40 2012 -0500
@@ -1155,6 +1155,15 @@
             uops[1]->setLastMicroop();
 
         }
+#else
+        if (_dest == INTREG_PC) {
+            flags[IsControl] = true;
+            flags[IsIndirectControl] = true;
+            if (conditional)
+                flags[IsCondControl] = true;
+            else
+                flags[IsUncondControl] = true;
+        }
 #endif
     }
 }};
@@ -1198,6 +1207,15 @@
             uops[1] = new %(wb_decl)s;
             uops[1]->setLastMicroop();
         }
+#else
+        if (_dest == INTREG_PC) {
+            flags[IsControl] = true;
+            flags[IsIndirectControl] = true;
+            if (conditional)
+                flags[IsCondControl] = true;
+            else
+                flags[IsUncondControl] = true;
+        }
 #endif
     }
 }};
diff -r 1f43ff3d9bc6 -r dab0f29394f0 src/arch/arm/isa/templates/pred.isa
--- a/src/arch/arm/isa/templates/pred.isa       Tue Sep 25 11:49:40 2012 -0500
+++ b/src/arch/arm/isa/templates/pred.isa       Tue Sep 25 11:49:40 2012 -0500
@@ -76,6 +76,15 @@
                 _srcRegIdx[_numSrcRegs++] = _destRegIdx[x];
             }
         }
+
+        if (%(is_branch)s){
+            flags[IsControl] = true;
+            flags[IsIndirectControl] = true;
+            if (condCode == COND_AL || condCode == COND_UC)
+                flags[IsUncondControl] = true;
+            else
+                flags[IsCondControl] = true;
+        }
     }
 }};
 
_______________________________________________
gem5-dev mailing list
[email protected]
http://m5sim.org/mailman/listinfo/gem5-dev

Reply via email to