arm: Add branch flags onto macroops
authorAndrew Bardsley <Andrew.Bardsley@arm.com>
Fri, 9 May 2014 22:58:47 +0000 (18:58 -0400)
committerAndrew Bardsley <Andrew.Bardsley@arm.com>
Fri, 9 May 2014 22:58:47 +0000 (18:58 -0400)
Mark branch flags onto macroops to allow branch prediction before
microop decomposition

src/arch/arm/insts/macromem.cc
src/arch/arm/isa/templates/mem.isa

index cd77d6d5f4d7e047369ac2003dc0d4c64eab44ec..2ada2953927de15ddb766cd1bfbe290bfd652a5b 100644 (file)
@@ -171,6 +171,16 @@ MacroMemOp::MacroMemOp(const char *mnem, ExtMachInst machInst,
 
     (*uop)->setLastMicroop();
 
+    /* Take the control flags from the last microop for the macroop */
+    if ((*uop)->isControl())
+        setFlag(StaticInst::IsControl);
+    if ((*uop)->isCondCtrl())
+        setFlag(StaticInst::IsCondControl);
+    if ((*uop)->isIndirectCtrl())
+        setFlag(StaticInst::IsIndirectControl);
+    if ((*uop)->isReturn())
+        setFlag(StaticInst::IsReturn);
+
     for (StaticInstPtr *curUop = microOps;
             !(*curUop)->isLastMicroop(); curUop++) {
         MicroOp * uopPtr = dynamic_cast<MicroOp *>(curUop->get());
index 6199c0920e898b2f09ccbe771ad3422867123e0b..f1d1523f4a48397853de8952946f8c12736df582 100644 (file)
@@ -1214,12 +1214,21 @@ def template LoadImmConstructor {{
             uops[2] = new MicroUopRegMov(machInst, INTREG_PC, INTREG_UREG0);
             uops[2]->setFlag(StaticInst::IsControl);
             uops[2]->setFlag(StaticInst::IsIndirectControl);
-            if (conditional)
+            /* Also set flags on the macroop so that pre-microop decomposition
+                branch prediction can work */
+            setFlag(StaticInst::IsControl);
+            setFlag(StaticInst::IsIndirectControl);
+            if (conditional) {
                 uops[2]->setFlag(StaticInst::IsCondControl);
-            else
+                setFlag(StaticInst::IsCondControl);
+            } else {
                 uops[2]->setFlag(StaticInst::IsUncondControl);
-            if (_base == INTREG_SP && _add && _imm == 4 && %(is_ras_pop)s)
+                setFlag(StaticInst::IsUncondControl);
+            }
+            if (_base == INTREG_SP && _add && _imm == 4 && %(is_ras_pop)s) {
                 uops[2]->setFlag(StaticInst::IsReturn);
+                setFlag(StaticInst::IsReturn);
+            }
             uops[2]->setLastMicroop();
         } else {
             uops[0] = new %(acc_name)s(machInst, _dest, _base, _add, _imm);