Only print commit log if instruction commits
authorAndrew Waterman <waterman@eecs.berkeley.edu>
Fri, 13 Jun 2014 09:42:54 +0000 (02:42 -0700)
committerAndrew Waterman <waterman@eecs.berkeley.edu>
Fri, 13 Jun 2014 09:42:54 +0000 (02:42 -0700)
riscv/decode.h
riscv/processor.cc
riscv/processor.h

index ceaf492f8ce7695e7139a06a5fdc30efbeff1244..4c3d274b613f0036af5f9b7644d82a0a19f45a82 100644 (file)
@@ -104,7 +104,7 @@ private:
         bool in_spvr = p->get_state()->sr & SR_S; \
         reg_t wdata = value; /* value is a func with side-effects */ \
         if (!in_spvr) \
-          fprintf(stderr, "x%u 0x%016" PRIx64, insn.rd(), ((uint64_t) wdata)); \
+          p->get_state()->log_reg_write = (commit_log_reg_t){insn.rd() << 1, wdata}; \
         p->get_state()->XPR.write(insn.rd(), wdata); \
       })
 #endif
@@ -120,7 +120,7 @@ private:
         bool in_spvr = p->get_state()->sr & SR_S; \
         freg_t wdata = value; /* value is a func with side-effects */ \
         if (!in_spvr) \
-          fprintf(stderr, "f%u 0x%016" PRIx64, insn.rd(), ((uint64_t) wdata)); \
+          p->get_state()->log_reg_write = (commit_log_reg_t){(insn.rd() << 1) | 1, wdata}; \
         p->get_state()->FPR.write(insn.rd(), wdata); \
       })
 #endif
index 8cece3ee5a46bd5997254a0e676b82aeb3211c3b..e40e65b90360a1385163cfbb32250b0faebab88b 100644 (file)
@@ -99,8 +99,13 @@ void processor_t::take_interrupt()
 static void commit_log(state_t* state, insn_t insn)
 {
 #ifdef RISCV_ENABLE_COMMITLOG
-  if (!(state->sr & SR_S))
+  if (!(state->sr & SR_S)) {
     fprintf(stderr, "\n0x%016" PRIx64 " (0x%08" PRIx32 ") ", state->pc, insn.bits());
+    if (state->log_reg_write.addr)
+      fprintf(stderr, "%c%02u 0x%016" PRIx64, state->log_reg_write.addr & 1 ? 'f' : 'x',
+              state->log_reg_write.addr >> 1, state->log_reg_write.data);
+    state->log_reg_write.addr = 0;
+  }
 #endif
 }
 
@@ -136,9 +141,10 @@ void processor_t::step(size_t n)
       #define ICACHE_ACCESS(idx) { \
         insn_t insn = ic_entry->data.insn.insn; \
         insn_func_t func = ic_entry->data.func; \
-        commit_log(&state, insn); \
         ic_entry++; \
-        state.pc = func(this, insn, state.pc); \
+        reg_t pc = func(this, insn, state.pc); \
+        commit_log(&state, insn); \
+        state.pc = pc; \
         if (idx < ICACHE_SIZE-1 && unlikely(ic_entry->tag != state.pc)) break; \
       }
 
index e2847faefaf1ff60ff890d95ad0521502f8f00a3..41268f9d2b40575e8f64954154e153700a9561b9 100644 (file)
@@ -23,6 +23,12 @@ struct insn_desc_t
   insn_func_t rv64;
 };
 
+struct commit_log_reg_t
+{
+  uint32_t addr;
+  reg_t data;
+};
+
 // architectural state of a RISC-V hart
 struct state_t
 {
@@ -49,6 +55,10 @@ struct state_t
   uint32_t frm;
 
   reg_t load_reservation;
+
+#ifdef RISCV_ENABLE_COMMITLOG
+  commit_log_reg_t log_reg_write;
+#endif
 };
 
 // this class represents one processor in a RISC-V machine.