diff options
author | Bruce Hoult <bruce@hoult.org> | 2019-02-24 15:14:12 -0800 |
---|---|---|
committer | Bruce Hoult <bruce@hoult.org> | 2019-02-24 18:57:10 -0800 |
commit | 9049d19e936b9c319122635096f12a0977be3ac1 (patch) | |
tree | ed329e707434430ee76f1300fe1549afe24531d9 /riscv/execute.cc | |
parent | 9a46ecee8d77de79f23420884a0798d9b26f2fda (diff) | |
download | spike-9049d19e936b9c319122635096f12a0977be3ac1.zip spike-9049d19e936b9c319122635096f12a0977be3ac1.tar.gz spike-9049d19e936b9c319122635096f12a0977be3ac1.tar.bz2 |
Add comparison of user state (XPR, FPR, VPR) after each instruction
Diffstat (limited to 'riscv/execute.cc')
-rw-r--r-- | riscv/execute.cc | 63 |
1 files changed, 63 insertions, 0 deletions
diff --git a/riscv/execute.cc b/riscv/execute.cc index e639e90..b55571b 100644 --- a/riscv/execute.cc +++ b/riscv/execute.cc @@ -88,6 +88,10 @@ bool processor_t::slow_path() return debug || state.single_step != state.STEP_NONE || state.dcsr.cause; } +extern const char* xpr_name[NXPR]; +extern const char* fpr_name[NFPR]; +extern const char* vr_name[NVPR]; + // fetch/decode/execute loop void processor_t::step(size_t n) { @@ -141,11 +145,70 @@ void processor_t::step(size_t n) state.single_step = state.STEP_STEPPED; } + if (debug && !state.prev_state) { // lazy init + prev_reg_state_t *saved = new prev_reg_state_t; + memcpy(&saved->VU, &state.VU, sizeof(vectorUnit_t)); + int v_regfile_sz = NVPR * (state.VU.VLEN/8); + saved->VU.reg_file = malloc(v_regfile_sz); + for (int i=0; i<NXPR; ++i) (reg_t&)saved->XPR[i] = 0xdeadbeefcafebabe; + for (int i=0; i<NFPR; ++i) saved->FPR.write(i, freg(f64(161803398875))); + for (int i=0; i<NVPR; ++i) { + for (reg_t j=0; j<state.VU.VLEN/32; ++j) { + saved->VU.elt<uint32_t>(i, j) = f32(0xdeadbeef).v; + } + } + state.prev_state = saved; + } + insn_fetch_t fetch = mmu->load_insn(pc); if (debug && !state.serialized) disasm(fetch.insn); pc = execute_insn(this, pc, fetch); + if (debug && !state.serialized) { + prev_reg_state_t *saved = state.prev_state; + if (saved->VU.setvl_count != state.VU.setvl_count) { + fprintf(stderr, "vconfig <- sew=%lu vlmul=%d vlmax=%lu vl=%lu\n", + state.VU.vsew, state.VU.vlmul, state.VU.vlmax, state.VU.vl); + saved->VU.setvl_count = state.VU.setvl_count; + } + for (int i=0; i<NXPR; ++i) { + reg_t &old = (reg_t&)saved->XPR[i]; + reg_t now = state.XPR[i]; + if (now != old) { + fprintf(stderr, "x%d %s <- 0x%016lx %ld\n", i, xpr_name[i], now, now); + old = now; + } + } + for (int i=0; i<NFPR; ++i) { + freg_t &old = (freg_t&)saved->FPR[i]; + freg_t now = state.FPR[i]; + if (f64(now).v != f64(old).v) { + uint64_t v = f64(now).v; + double dv; + float fv; + memcpy(&dv, &v, sizeof(dv)); + memcpy(&fv, &v, sizeof(fv)); + fprintf(stderr, "f%d %s <- 0x%016lx %f %f\n", i, fpr_name[i], v, dv, fv); + old = now; + } + } + for (reg_t i=0; i<NVPR; ++i) { + if (!state.VU.reg_referenced[i]) continue; + for (reg_t j=0; j<state.VU.VLEN/32; ++j) { + uint32_t &old = saved->VU.elt<uint32_t>(i, j); + uint32_t now = state.VU.elt<uint32_t>(i, j); + if (now != old) { + float fv; + memcpy(&fv, &now, sizeof(fv)); + fprintf(stderr, "v%ld[%ld] <- 0x%08x %f\n", i, j, now, fv); + old = now; + } + } + state.VU.reg_referenced[i] = 0; + } + } + advance_pc(); if (unlikely(state.pc >= DEBUG_ROM_ENTRY && |