cpu: Update DRAM traffic gen
[gem5.git] / src / cpu / inorder / resources / execution_unit.cc
index 460ec32fe54f711b2b3048fe36185ba6714d32c1..296d5126fa7a4bc981419d234ef3f18402b361cb 100644 (file)
 #include "cpu/inorder/resources/execution_unit.hh"
 #include "cpu/inorder/cpu.hh"
 #include "cpu/inorder/resource_pool.hh"
+#include "debug/Fault.hh"
 #include "debug/InOrderExecute.hh"
 #include "debug/InOrderStall.hh"
+#include "sim/full_system.hh"
 
 using namespace std;
 using namespace ThePipeline;
 
 ExecutionUnit::ExecutionUnit(string res_name, int res_id, int res_width,
-                             int res_latency, InOrderCPU *_cpu,
+                             Cycles res_latency, InOrderCPU *_cpu,
                              ThePipeline::Params *params)
     : Resource(res_name, res_id, res_width, res_latency, _cpu),
-      lastExecuteTick(0), lastControlTick(0), serializeTick(0)
+      lastExecuteTick(0), lastControlTick(0)
 { }
 
 void
@@ -87,6 +89,15 @@ ExecutionUnit::execute(int slot_num)
 {
     ResourceRequest* exec_req = reqs[slot_num];
     DynInstPtr inst = reqs[slot_num]->inst;
+    if (inst->fault != NoFault) {
+        DPRINTF(InOrderExecute,
+                "[tid:%i]: [sn:%i]: Detected %s fault @ %x. Forwarding to "
+                "next stage.\n", inst->readTid(), inst->seqNum, inst->fault->name(),
+                inst->pcState());
+        exec_req->done();
+        return;
+    }
+
     Fault fault = NoFault;
     Tick cur_tick = curTick();
     unsigned stage_num = exec_req->getStageNum();
@@ -94,13 +105,6 @@ ExecutionUnit::execute(int slot_num)
 #if TRACING_ON
     InstSeqNum seq_num = inst->seqNum;
 #endif
-    if (cur_tick == serializeTick) {
-        DPRINTF(InOrderExecute, "Can not execute [tid:%i][sn:%i][PC:%s] %s. "
-                "All instructions are being serialized this cycle\n",
-                inst->readTid(), seq_num, inst->pcState(), inst->instName());
-        exec_req->done(false);
-        return;
-    }
 
     switch (exec_req->cmd)
     {
@@ -122,15 +126,9 @@ ExecutionUnit::execute(int slot_num)
                 lastExecuteTick = cur_tick;
             }
 
+            //@todo: handle address generation here
             assert(!inst->isMemRef());
 
-            if (inst->isSerializeAfter()) {
-                serializeTick = cur_tick;
-                DPRINTF(InOrderExecute, "Serializing execution after [tid:%i] "
-                        "[sn:%i] [PC:%s] %s.\n", inst->readTid(), seq_num,
-                        inst->pcState(), inst->instName());
-            }
-
             if (inst->isControl()) {
                 if (lastControlTick == cur_tick) {
                     DPRINTF(InOrderExecute, "Can not Execute More than One Control "
@@ -210,25 +208,26 @@ ExecutionUnit::execute(int slot_num)
 #if TRACING_ON
                     for (int didx = 0; didx < inst->numDestRegs(); didx++)
                         if (inst->resultType(didx) == InOrderDynInst::Float ||
+                            inst->resultType(didx) == InOrderDynInst::FloatBits ||
                             inst->resultType(didx) == InOrderDynInst::Double)
                             DPRINTF(InOrderExecute, "[tid:%i]: [sn:%i]: Dest result %i "
                                     "of FP execution is %08f (%x).\n", inst->readTid(),
                                     seq_num, didx, inst->readFloatResult(didx),
-                                    inst->readIntResult(didx));
+                                    inst->readFloatBitsResult(didx));
                         else
                             DPRINTF(InOrderExecute, "[tid:%i]: [sn:%i]: Dest result %i "
                                     "of Int execution is 0x%x.\n", inst->readTid(),
                                     seq_num, didx, inst->readIntResult(didx));
 #endif
 
-#if !FULL_SYSTEM
-                    // The Syscall might change the PC, so conservatively
-                    // squash everything behing it
-                    if (inst->isSyscall()) {
-                        inst->setSquashInfo(stage_num);
-                        setupSquash(inst, stage_num, tid);
+                    if (!FullSystem) {
+                        // The Syscall might change the PC, so conservatively
+                        // squash everything behing it
+                        if (inst->isSyscall()) {
+                            inst->setSquashInfo(stage_num);
+                            setupSquash(inst, stage_num, tid);
+                        }
                     }
-#endif
                 } else {
                     DPRINTF(InOrderExecute, "[tid:%i]: [sn:%i]: had a %s "
                             "fault.\n", inst->readTid(), seq_num, fault->name());