From 83d70c3295c7e4da6d1c43cfe2d05ce2e2a96a97 Mon Sep 17 00:00:00 2001 From: Zihao Yu Date: Mon, 20 Apr 2020 13:52:07 +0800 Subject: [PATCH] engine,rv64,spill: no need to writeback s0/s1 * they are only valid during the translation of a single instruction --- src/engine/rv64/spill.c | 27 +++++++++++++++++++++++---- src/engine/rv64/spill.h | 1 - src/engine/rv64/tran.c | 3 +++ 3 files changed, 26 insertions(+), 5 deletions(-) diff --git a/src/engine/rv64/spill.c b/src/engine/rv64/spill.c index 013942e3..de6d3398 100644 --- a/src/engine/rv64/spill.c +++ b/src/engine/rv64/spill.c @@ -16,11 +16,14 @@ void spill_init() { tmp_regs[1].rvidx = TMP_REG_2; } +void spill_flush(int tmpidx) { + tmp_regs[tmpidx].spmidx = 0; + tmp_regs[tmpidx].dirty = 0; +} + void spill_reset() { - tmp_regs[0].spmidx = 0; - tmp_regs[0].dirty = 0; - tmp_regs[1].spmidx = 0; - tmp_regs[1].dirty = 0; + spill_flush(0); + spill_flush(1); } int spmidx2tmpidx(uint32_t spmidx) { @@ -146,3 +149,19 @@ void spill_set_dirty_rvidx(uint32_t rvidx) { int tmpidx = rvidx2tmpidx(rvidx); if (tmpidx != -1) spill_set_dirty(tmpidx); } + +// this will be called after every translation of an instruction +// to flush RTL tmp registers, since their life-cycle is only +// valid during the translation of a single instruction +static void spill_flush_local_internal(DecodeExecState *s, const rtlreg_t *dest) { + uint32_t varidx = rtlreg2varidx(s, dest); + for (int i = 0; i < TMP_REG_NUM; i++) { + if (tmp_regs[i].spmidx == varidx && tmp_regs[i].dirty) spill_flush(i); + } +} +void spill_flush_local() { + DecodeExecState state; // only used in rtlreg2varidx() + DecodeExecState *s = &state; + spill_flush_local_internal(s, s0); + spill_flush_local_internal(s, s1); +} diff --git a/src/engine/rv64/spill.h b/src/engine/rv64/spill.h index 04d48e61..a1e226a4 100644 --- a/src/engine/rv64/spill.h +++ b/src/engine/rv64/spill.h @@ -12,7 +12,6 @@ uint32_t spmidx2rvidx(uint32_t); uint32_t spill_out_and_remap(DecodeExecState*, uint32_t); -void spill_flush(uint32_t); void spill_flush_all(); void cal_suffix_inst(); void spill_writeback_all(); diff --git a/src/engine/rv64/tran.c b/src/engine/rv64/tran.c index ce388f08..4c2d97ca 100644 --- a/src/engine/rv64/tran.c +++ b/src/engine/rv64/tran.c @@ -18,6 +18,7 @@ void asm_print(vaddr_t ori_pc, int instr_len, bool print_flag); vaddr_t rv64_exec_trans_buffer(void *buf, int nr_instr, int npc_type); void guest_getregs(CPU_state *cpu); void spill_reset(); +void spill_flush_local(); typedef struct TB { vaddr_t pc; @@ -103,6 +104,8 @@ void mainloop() { __attribute__((unused)) vaddr_t seq_pc = isa_exec_once(); guest_nr_instr ++; + spill_flush_local(); + if (nemu_state.state != NEMU_RUNNING) tran_next_pc = NEXT_PC_END; #ifdef DEBUG -- GitLab