CPU: Make Exec trace to print predication result (if false) for memory instructions
authorMin Kyu Jeong <minkyu.jeong@arm.com>
Mon, 23 Aug 2010 16:18:41 +0000 (11:18 -0500)
committerMin Kyu Jeong <minkyu.jeong@arm.com>
Mon, 23 Aug 2010 16:18:41 +0000 (11:18 -0500)
src/cpu/base_dyn_inst.hh
src/cpu/exetrace.cc
src/cpu/o3/lsq_unit_impl.hh
src/cpu/simple/base.hh
src/sim/insttracer.hh

index a992664d091a7eb8342219369bf20b2ea6c35766..41cb13949cedb244090707e7ee71b73f9dcafe14 100644 (file)
@@ -805,6 +805,10 @@ class BaseDynInst : public FastAlloc, public RefCounted
     void setPredicate(bool val)
     {
         predicate = val;
+
+        if (traceData) {
+            traceData->setPredicate(val);
+        }
     }
 
     /** Sets the ASID. */
index 28c7861ef97d95188a2ad388292b47f8276af82a..051ee57a05ab8f91d6b06bf60a90dae9250a7271 100644 (file)
@@ -111,6 +111,10 @@ Trace::ExeTracerRecord::traceInst(StaticInstPtr inst, bool ran)
             outs << Enums::OpClassStrings[inst->opClass()] << " : ";
         }
 
+        if (IsOn(ExecResult) && predicate == false) {
+            outs << "Predicated False";
+        }
+
         if (IsOn(ExecResult) && data_status != DataInvalid) {
             ccprintf(outs, " D=%#018x", data.as_int);
         }
index 9e6bbe92f033edccdbe02010e0064ee281b969d7..7330ba2ef0c1b5069579ceffddf84312808cd8c3 100644 (file)
@@ -458,6 +458,9 @@ LSQUnit<Impl>::executeLoad(DynInstPtr &inst)
         // realizes there is activity.
         // Mark it as executed unless it is an uncached load that
         // needs to hit the head of commit.
+        DPRINTF(LSQUnit, "Load [sn:%lli] not executed from %s\n",
+                inst->seqNum,
+                (load_fault != NoFault ? "fault" : "predication"));
         if (!(inst->hasRequest() && inst->uncacheable()) ||
             inst->isAtCommit()) {
             inst->setExecuted();
index 90cb81c0cc68c9a3d036d2804a18c2fc29643c22..24527f9ebfd97a670d7cd8cb2faf15c670d227dd 100644 (file)
@@ -295,7 +295,12 @@ class BaseSimpleCPU : public BaseCPU
     void setNextMicroPC(uint64_t val) { thread->setNextMicroPC(val); }
     void setNextNPC(uint64_t val) { thread->setNextNPC(val); }
     void setPredicate(bool val)
-    { return thread->setPredicate(val); }
+    {
+        thread->setPredicate(val);
+        if (traceData) {
+            traceData->setPredicate(val);
+        }
+    }
 
     MiscReg readMiscRegNoEffect(int misc_reg)
     {
index a8cdff671f36c61373533bd98dcedeb3d02136f9..c3f3eb32340956eb53a8d1fca0ceb30bb77c35b2 100644 (file)
@@ -58,6 +58,7 @@ class InstRecord
     StaticInstPtr macroStaticInst;
     MicroPC upc;
     bool misspeculating;
+    bool predicate;
 
     // The remaining fields are only valid for particular instruction
     // types (e.g, addresses for memory ops) or when particular
@@ -102,6 +103,7 @@ class InstRecord
 
         fetch_seq_valid = false;
         cp_seq_valid = false;
+        predicate = false;
     }
 
     virtual ~InstRecord() { }
@@ -128,6 +130,8 @@ class InstRecord
     void setCPSeq(InstSeqNum seq)
     { cp_seq = seq; cp_seq_valid = true; }
 
+    void setPredicate(bool val) { predicate = val; }
+
     virtual void dump() = 0;
     
   public: