提交 9a677dac 编写于 作者: Z Zihao Yu

engine,rv64: remove unused code

上级 b51f5e5a
...@@ -12,6 +12,7 @@ void (*backend_exec)(uint64_t n) = NULL; ...@@ -12,6 +12,7 @@ void (*backend_exec)(uint64_t n) = NULL;
void backend_exec_code(uint64_t pc, int nr_instr); void backend_exec_code(uint64_t pc, int nr_instr);
void guest_setregs(const CPU_state *cpu); void guest_setregs(const CPU_state *cpu);
void spill_init();
static void init_rv64_interpreter() { static void init_rv64_interpreter() {
char so_file[256]; char so_file[256];
...@@ -86,4 +87,5 @@ void init_engine() { ...@@ -86,4 +87,5 @@ void init_engine() {
backend_exec_code(riscv64_PMEM_BASE, 100); backend_exec_code(riscv64_PMEM_BASE, 100);
guest_setregs(&cpu); guest_setregs(&cpu);
init_rv64_reg(); init_rv64_reg();
spill_init();
} }
...@@ -41,14 +41,7 @@ int rtlreg_is_spm(DecodeExecState *s, const rtlreg_t* dest) { ...@@ -41,14 +41,7 @@ int rtlreg_is_spm(DecodeExecState *s, const rtlreg_t* dest) {
uint32_t rtlreg2rvidx(DecodeExecState *s, const rtlreg_t* dest) { uint32_t rtlreg2rvidx(DecodeExecState *s, const rtlreg_t* dest) {
uint32_t varidx = rtlreg2varidx(s, dest); uint32_t varidx = rtlreg2varidx(s, dest);
if (!(varidx & SPMIDX_MASK)) return varidx; if (!(varidx & SPMIDX_MASK)) return varidx;
assert(0);
uint32_t spmidx = varidx;
uint32_t rvidx = spmidx2rvidx(spmidx);
// if `dest` is already mapped, just return the corresponding rvidx
if (rvidx) return rvidx;
// if `dest` is not mapped, spill out one tmp_reg and remap
return spill_out_and_remap(s, spmidx);
} }
void guest_getregs(CPU_state *mips32) { void guest_getregs(CPU_state *mips32) {
......
#include <isa/riscv64.h> #include <isa/riscv64.h>
#include "../tran.h" #include "../tran.h"
#include "../spill.h"
#define RV64_EXEC_PC (riscv64_PMEM_BASE + BBL_MAX_SIZE) // skip bbl #define RV64_EXEC_PC (riscv64_PMEM_BASE + BBL_MAX_SIZE) // skip bbl
...@@ -38,9 +37,5 @@ vaddr_t rv64_exec_trans_buffer(void *buf, int nr_instr, int npc_type) { ...@@ -38,9 +37,5 @@ vaddr_t rv64_exec_trans_buffer(void *buf, int nr_instr, int npc_type) {
backend_getregs(&r); backend_getregs(&r);
} }
#ifdef REG_SPILLING
tmp_regs_reset();
#endif
return r.gpr[tmp0]._64; return r.gpr[tmp0]._64;
} }
...@@ -7,9 +7,6 @@ void rv64_relop(uint32_t relop, uint32_t idx_dest, uint32_t idx_src1, uint32_t i ...@@ -7,9 +7,6 @@ void rv64_relop(uint32_t relop, uint32_t idx_dest, uint32_t idx_src1, uint32_t i
uint32_t rtlreg2rvidx(DecodeExecState *s, const rtlreg_t* dest); uint32_t rtlreg2rvidx(DecodeExecState *s, const rtlreg_t* dest);
uint32_t dest2rvidx(DecodeExecState *s, const rtlreg_t* dest); uint32_t dest2rvidx(DecodeExecState *s, const rtlreg_t* dest);
uint32_t src2rvidx(DecodeExecState *s, const rtlreg_t* src); uint32_t src2rvidx(DecodeExecState *s, const rtlreg_t* src);
#ifdef REG_SPILLING
uint32_t rtlreg2varidx(DecodeExecState *s, const rtlreg_t* dest);
#endif
static inline void rv64_zextw(uint32_t rd, uint32_t rs) { static inline void rv64_zextw(uint32_t rd, uint32_t rs) {
// mask32 is set during initialization // mask32 is set during initialization
...@@ -59,7 +56,6 @@ static inline void load_imm_no_opt(uint32_t r, const sword_t imm) { ...@@ -59,7 +56,6 @@ static inline void load_imm_no_opt(uint32_t r, const sword_t imm) {
/* RTL basic instructions */ /* RTL basic instructions */
#ifdef REG_SPILLING
#define make_rtl_compute_reg(rtl_name, rv64_name) \ #define make_rtl_compute_reg(rtl_name, rv64_name) \
make_rtl(rtl_name, rtlreg_t* dest, const rtlreg_t* src1, const rtlreg_t* src2) { \ make_rtl(rtl_name, rtlreg_t* dest, const rtlreg_t* src1, const rtlreg_t* src2) { \
uint32_t ret = rtlreg2rvidx_pair(s, src1, true, src2, true); \ uint32_t ret = rtlreg2rvidx_pair(s, src1, true, src2, true); \
...@@ -68,15 +64,6 @@ static inline void load_imm_no_opt(uint32_t r, const sword_t imm) { ...@@ -68,15 +64,6 @@ static inline void load_imm_no_opt(uint32_t r, const sword_t imm) {
uint32_t dest_rvidx = dest2rvidx(s, dest); \ uint32_t dest_rvidx = dest2rvidx(s, dest); \
concat(rv64_, rv64_name) (dest_rvidx, src1_rvidx, src2_rvidx); \ concat(rv64_, rv64_name) (dest_rvidx, src1_rvidx, src2_rvidx); \
} }
#else
#define make_rtl_compute_reg(rtl_name, rv64_name) \
make_rtl(rtl_name, rtlreg_t* dest, const rtlreg_t* src1, const rtlreg_t* src2) { \
uint32_t dest_rvidx = rtlreg2rvidx(s, dest); \
uint32_t src1_rvidx = rtlreg2rvidx(s, src1); \
uint32_t src2_rvidx = rtlreg2rvidx(s, src2); \
concat(rv64_, rv64_name) (dest_rvidx, src1_rvidx, src2_rvidx); \
}
#endif
#define make_rtl_compute_imm(rtl_name, rv64_name) \ #define make_rtl_compute_imm(rtl_name, rv64_name) \
make_rtl(rtl_name, rtlreg_t* dest, const rtlreg_t* src1, const sword_t imm) { \ make_rtl(rtl_name, rtlreg_t* dest, const rtlreg_t* src1, const sword_t imm) { \
...@@ -131,7 +118,6 @@ make_rtl_compute_imm(shri, srliw) ...@@ -131,7 +118,6 @@ make_rtl_compute_imm(shri, srliw)
make_rtl_compute_imm(sari, sraiw) make_rtl_compute_imm(sari, sraiw)
#endif #endif
#ifdef REG_SPILLING
make_rtl(setrelop, uint32_t relop, rtlreg_t *dest, const rtlreg_t *src1, const rtlreg_t *src2) { make_rtl(setrelop, uint32_t relop, rtlreg_t *dest, const rtlreg_t *src1, const rtlreg_t *src2) {
uint32_t ret = rtlreg2rvidx_pair(s, src1, true, src2, true); uint32_t ret = rtlreg2rvidx_pair(s, src1, true, src2, true);
uint32_t src1_rvidx = ret >> 16; uint32_t src1_rvidx = ret >> 16;
...@@ -139,14 +125,6 @@ make_rtl(setrelop, uint32_t relop, rtlreg_t *dest, const rtlreg_t *src1, const r ...@@ -139,14 +125,6 @@ make_rtl(setrelop, uint32_t relop, rtlreg_t *dest, const rtlreg_t *src1, const r
uint32_t dest_rvidx = dest2rvidx(s, dest); uint32_t dest_rvidx = dest2rvidx(s, dest);
rv64_relop(relop, dest_rvidx, src1_rvidx, src2_rvidx); rv64_relop(relop, dest_rvidx, src1_rvidx, src2_rvidx);
} }
#else
make_rtl(setrelop, uint32_t relop, rtlreg_t *dest, const rtlreg_t *src1, const rtlreg_t *src2) {
uint32_t dest_rvidx = rtlreg2rvidx(s, dest);
uint32_t src1_rvidx = rtlreg2rvidx(s, src1);
uint32_t src2_rvidx = rtlreg2rvidx(s, src2);
rv64_relop(relop, dest_rvidx, src1_rvidx, src2_rvidx);
}
#endif
make_rtl(setrelopi, uint32_t relop, rtlreg_t *dest, const rtlreg_t *src1, const sword_t imm) { make_rtl(setrelopi, uint32_t relop, rtlreg_t *dest, const rtlreg_t *src1, const sword_t imm) {
int big_imm = load_imm_big(tmp0, imm); int big_imm = load_imm_big(tmp0, imm);
...@@ -181,7 +159,6 @@ make_rtl_compute_reg(idiv_r, remw) ...@@ -181,7 +159,6 @@ make_rtl_compute_reg(idiv_r, remw)
# define rv64_imul_hi(c, a, b) TODO() # define rv64_imul_hi(c, a, b) TODO()
#else #else
#ifdef REG_SPILLING
make_rtl(mul_hi, rtlreg_t* dest, const rtlreg_t* src1, const rtlreg_t* src2) { make_rtl(mul_hi, rtlreg_t* dest, const rtlreg_t* src1, const rtlreg_t* src2) {
uint32_t ret = rtlreg2rvidx_pair(s, src1, true, src2, true); uint32_t ret = rtlreg2rvidx_pair(s, src1, true, src2, true);
uint32_t src1_rvidx = ret >> 16; uint32_t src1_rvidx = ret >> 16;
...@@ -203,33 +180,12 @@ make_rtl(imul_hi, rtlreg_t* dest, const rtlreg_t* src1, const rtlreg_t* src2) { ...@@ -203,33 +180,12 @@ make_rtl(imul_hi, rtlreg_t* dest, const rtlreg_t* src1, const rtlreg_t* src2) {
rv64_mul(dest_rvidx, src1_rvidx, src2_rvidx); rv64_mul(dest_rvidx, src1_rvidx, src2_rvidx);
rv64_srai(dest_rvidx, dest_rvidx, 32); rv64_srai(dest_rvidx, dest_rvidx, 32);
} }
#else
make_rtl(mul_hi, rtlreg_t* dest, const rtlreg_t* src1, const rtlreg_t* src2) {
uint32_t idx_dest = rtlreg2rvidx(s, dest);
uint32_t idx_src1 = rtlreg2rvidx(s, src1);
uint32_t idx_src2 = rtlreg2rvidx(s, src2);
rv64_zextw(idx_src1, idx_src1);
rv64_zextw(idx_src2, idx_src2);
rv64_mul(idx_dest, idx_src1, idx_src2);
rv64_srai(idx_dest, idx_dest, 32);
}
make_rtl(imul_hi, rtlreg_t* dest, const rtlreg_t* src1, const rtlreg_t* src2) {
uint32_t idx_dest = rtlreg2rvidx(s, dest);
uint32_t idx_src1 = rtlreg2rvidx(s, src1);
uint32_t idx_src2 = rtlreg2rvidx(s, src2);
rv64_sextw(idx_src1, idx_src1);
rv64_sextw(idx_src2, idx_src2);
rv64_mul(idx_dest, idx_src1, idx_src2);
rv64_srai(idx_dest, idx_dest, 32);
}
#endif
#endif #endif
make_rtl(div64_q, rtlreg_t* dest, make_rtl(div64_q, rtlreg_t* dest,
const rtlreg_t* src1_hi, const rtlreg_t* src1_lo, const rtlreg_t* src2) { const rtlreg_t* src1_hi, const rtlreg_t* src1_lo, const rtlreg_t* src2) {
#ifdef REG_SPILLING #ifndef __ISA_x86__
panic("If reg-spilling enabled, you should not use div64 rtl!\n"); panic("only used in x86\n");
#endif #endif
uint32_t idx_dest = rtlreg2rvidx(s, dest); uint32_t idx_dest = rtlreg2rvidx(s, dest);
uint32_t idx_src1_hi = rtlreg2rvidx(s, src1_hi); uint32_t idx_src1_hi = rtlreg2rvidx(s, src1_hi);
...@@ -245,8 +201,8 @@ make_rtl(div64_q, rtlreg_t* dest, ...@@ -245,8 +201,8 @@ make_rtl(div64_q, rtlreg_t* dest,
make_rtl(div64_r, rtlreg_t* dest, make_rtl(div64_r, rtlreg_t* dest,
const rtlreg_t* src1_hi, const rtlreg_t* src1_lo, const rtlreg_t* src2) { const rtlreg_t* src1_hi, const rtlreg_t* src1_lo, const rtlreg_t* src2) {
#ifdef REG_SPILLING #ifndef __ISA_x86__
panic("If reg-spilling enabled, you should not use div64 rtl!\n"); panic("only used in x86\n");
#endif #endif
uint32_t idx_dest = rtlreg2rvidx(s, dest); uint32_t idx_dest = rtlreg2rvidx(s, dest);
uint32_t idx_src1_hi = rtlreg2rvidx(s, src1_hi); uint32_t idx_src1_hi = rtlreg2rvidx(s, src1_hi);
...@@ -262,8 +218,8 @@ make_rtl(div64_r, rtlreg_t* dest, ...@@ -262,8 +218,8 @@ make_rtl(div64_r, rtlreg_t* dest,
make_rtl(idiv64_q, rtlreg_t* dest, make_rtl(idiv64_q, rtlreg_t* dest,
const rtlreg_t* src1_hi, const rtlreg_t* src1_lo, const rtlreg_t* src2) { const rtlreg_t* src1_hi, const rtlreg_t* src1_lo, const rtlreg_t* src2) {
#ifdef REG_SPILLING #ifndef __ISA_x86__
panic("If reg-spilling enabled, you should not use div64 rtl!\n"); panic("only used in x86\n");
#endif #endif
uint32_t idx_dest = rtlreg2rvidx(s, dest); uint32_t idx_dest = rtlreg2rvidx(s, dest);
uint32_t idx_src1_hi = rtlreg2rvidx(s, src1_hi); uint32_t idx_src1_hi = rtlreg2rvidx(s, src1_hi);
...@@ -279,8 +235,8 @@ make_rtl(idiv64_q, rtlreg_t* dest, ...@@ -279,8 +235,8 @@ make_rtl(idiv64_q, rtlreg_t* dest,
make_rtl(idiv64_r, rtlreg_t* dest, make_rtl(idiv64_r, rtlreg_t* dest,
const rtlreg_t* src1_hi, const rtlreg_t* src1_lo, const rtlreg_t* src2) { const rtlreg_t* src1_hi, const rtlreg_t* src1_lo, const rtlreg_t* src2) {
#ifdef REG_SPILLING #ifndef __ISA_x86__
panic("If reg-spilling enabled, you should not use div64 rtl!\n"); panic("only used in x86\n");
#endif #endif
uint32_t idx_dest = rtlreg2rvidx(s, dest); uint32_t idx_dest = rtlreg2rvidx(s, dest);
uint32_t idx_src1_hi = rtlreg2rvidx(s, src1_hi); uint32_t idx_src1_hi = rtlreg2rvidx(s, src1_hi);
...@@ -348,7 +304,7 @@ make_rtl(sm, const rtlreg_t* addr, const sword_t imm, const rtlreg_t* src1, int ...@@ -348,7 +304,7 @@ make_rtl(sm, const rtlreg_t* addr, const sword_t imm, const rtlreg_t* src1, int
make_rtl(host_lm, rtlreg_t* dest, const void *addr, int len) { make_rtl(host_lm, rtlreg_t* dest, const void *addr, int len) {
#ifndef __ISA_x86__ #ifndef __ISA_x86__
panic("should not reach here"); panic("only used in x86\n");
#endif #endif
uint32_t idx_dest = rtlreg2rvidx(s, dest); uint32_t idx_dest = rtlreg2rvidx(s, dest);
...@@ -375,7 +331,7 @@ make_rtl(host_lm, rtlreg_t* dest, const void *addr, int len) { ...@@ -375,7 +331,7 @@ make_rtl(host_lm, rtlreg_t* dest, const void *addr, int len) {
make_rtl(host_sm, void *addr, const rtlreg_t *src1, int len) { make_rtl(host_sm, void *addr, const rtlreg_t *src1, int len) {
#ifndef __ISA_x86__ #ifndef __ISA_x86__
panic("should not reach here"); panic("only used in x86\n");
#endif #endif
uint32_t idx_src1 = rtlreg2rvidx(s, src1); uint32_t idx_src1 = rtlreg2rvidx(s, src1);
......
...@@ -6,22 +6,20 @@ ...@@ -6,22 +6,20 @@
typedef struct { typedef struct {
uint32_t rvidx; uint32_t rvidx;
uint32_t spmidx; uint32_t spmidx;
bool used, dirty; bool dirty;
} Tmp_reg; } Tmp_reg;
static Tmp_reg tmp_regs[TMP_REG_NUM]; static Tmp_reg tmp_regs[TMP_REG_NUM];
void tmp_regs_init() { void spill_init() {
assert(TMP_REG_NUM == 2); assert(TMP_REG_NUM == 2);
tmp_regs[0].rvidx = TMP_REG_1; tmp_regs[0].rvidx = TMP_REG_1;
tmp_regs[1].rvidx = TMP_REG_2; tmp_regs[1].rvidx = TMP_REG_2;
} }
void tmp_regs_reset() { void spill_reset() {
tmp_regs[0].spmidx = 0; tmp_regs[0].spmidx = 0;
tmp_regs[0].used = 0;
tmp_regs[0].dirty = 0; tmp_regs[0].dirty = 0;
tmp_regs[1].spmidx = 0; tmp_regs[1].spmidx = 0;
tmp_regs[1].used = 0;
tmp_regs[1].dirty = 0; tmp_regs[1].dirty = 0;
} }
...@@ -42,7 +40,6 @@ int rvidx2tmpidx(uint32_t rvidx) { ...@@ -42,7 +40,6 @@ int rvidx2tmpidx(uint32_t rvidx) {
uint32_t spmidx2rvidx(uint32_t spmidx) { uint32_t spmidx2rvidx(uint32_t spmidx) {
int tmpidx = spmidx2tmpidx(spmidx); int tmpidx = spmidx2tmpidx(spmidx);
if (tmpidx == -1) return 0; if (tmpidx == -1) return 0;
tmp_regs[tmpidx].used = 1;
return tmp_regs[tmpidx].rvidx; return tmp_regs[tmpidx].rvidx;
} }
...@@ -66,28 +63,12 @@ void spill_writeback_all() { // can be 0/1/2 inst ...@@ -66,28 +63,12 @@ void spill_writeback_all() { // can be 0/1/2 inst
} }
} }
void spill_flush(uint32_t spmidx) {
for (int i = 0; i < TMP_REG_NUM; i++) {
if (tmp_regs[i].spmidx == spmidx) {
tmp_regs[i].used = 0;
return;
}
}
}
void spill_flush_all() {
for (int i = 0; i < TMP_REG_NUM; i++) {
tmp_regs[i].used = 0;
}
}
// replace tmp_regs[tmpidx] with spmidx // replace tmp_regs[tmpidx] with spmidx
void spill_replace(uint32_t tmpidx, uint32_t spmidx, int load_val) { void spill_replace(uint32_t tmpidx, uint32_t spmidx, int load_val) {
spill_writeback(tmpidx); spill_writeback(tmpidx);
if (load_val) spm(lw, tmp_regs[tmpidx].rvidx, 4 * (spmidx & ~SPMIDX_MASK)); if (load_val) spm(lw, tmp_regs[tmpidx].rvidx, 4 * (spmidx & ~SPMIDX_MASK));
tmp_regs[tmpidx].spmidx = spmidx; tmp_regs[tmpidx].spmidx = spmidx;
tmp_regs[tmpidx].used = 1;
tmp_regs[tmpidx].dirty = false; tmp_regs[tmpidx].dirty = false;
} }
...@@ -157,28 +138,6 @@ uint32_t rtlreg2rvidx_pair(DecodeExecState *s, ...@@ -157,28 +138,6 @@ uint32_t rtlreg2rvidx_pair(DecodeExecState *s,
return (src1_varidx << 16) | src2_varidx; return (src1_varidx << 16) | src2_varidx;
} }
uint32_t spill_out_and_remap(DecodeExecState *s, uint32_t spmidx) {
int tmpidx;
for (tmpidx = 0; tmpidx < TMP_REG_NUM; tmpidx ++) {
if (tmp_regs[tmpidx].used == 0) break;
}
Assert(tmpidx < TMP_REG_NUM, "no clean tmp_regs!\nalready used:%u %u, req: %u\n",
tmp_regs[0].spmidx, tmp_regs[1].spmidx, spmidx);
spill_writeback(tmpidx);
spm(lw, tmp_regs[tmpidx].rvidx, 4 * (spmidx & ~SPMIDX_MASK));
tmp_regs[tmpidx].spmidx = spmidx;
tmp_regs[tmpidx].used = 1;
tmp_regs[tmpidx].dirty = false;
return tmp_regs[tmpidx].rvidx;
}
void spill_set_spmidx(uint32_t tmpidx, uint32_t new_spmidx) {
tmp_regs[tmpidx].spmidx = new_spmidx;
}
void spill_set_dirty(uint32_t tmpidx) { void spill_set_dirty(uint32_t tmpidx) {
tmp_regs[tmpidx].dirty = true; tmp_regs[tmpidx].dirty = true;
} }
......
...@@ -8,13 +8,8 @@ ...@@ -8,13 +8,8 @@
// default is $26, $27, which has low perf loss // default is $26, $27, which has low perf loss
#define TMP_REG_1 26 #define TMP_REG_1 26
#define TMP_REG_2 27 #define TMP_REG_2 27
#define TMP_REG_NUM 2 #define TMP_REG_NUM 2
#define TMPIDX_CNT 9
#define TMP_REG_MAX 233
void tmp_regs_init();
void tmp_regs_reset();
uint32_t spmidx2rvidx(uint32_t); uint32_t spmidx2rvidx(uint32_t);
uint32_t spill_out_and_remap(DecodeExecState*, uint32_t); uint32_t spill_out_and_remap(DecodeExecState*, uint32_t);
void spill_flush(uint32_t); void spill_flush(uint32_t);
......
...@@ -4,7 +4,6 @@ ...@@ -4,7 +4,6 @@
#include <isa.h> #include <isa.h>
#include <monitor/difftest.h> #include <monitor/difftest.h>
#include "tran.h" #include "tran.h"
#include "spill.h"
#define TOP_N 10 #define TOP_N 10
//#define DUMP_RV64 //#define DUMP_RV64
...@@ -18,6 +17,7 @@ static void clear_trans_buffer() { trans_buffer_index = 0; } ...@@ -18,6 +17,7 @@ static void clear_trans_buffer() { trans_buffer_index = 0; }
void asm_print(vaddr_t ori_pc, int instr_len, bool print_flag); 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); vaddr_t rv64_exec_trans_buffer(void *buf, int nr_instr, int npc_type);
void guest_getregs(CPU_state *cpu); void guest_getregs(CPU_state *cpu);
void spill_reset();
typedef struct TB { typedef struct TB {
vaddr_t pc; vaddr_t pc;
...@@ -88,9 +88,6 @@ void write_ins(uint32_t ins) { ...@@ -88,9 +88,6 @@ void write_ins(uint32_t ins) {
} }
void mainloop() { void mainloop() {
#ifdef REG_SPILLING
tmp_regs_init();
#endif
nemu_state.state = NEMU_RUNNING; nemu_state.state = NEMU_RUNNING;
uint64_t total_instr = 0; uint64_t total_instr = 0;
while (1) { while (1) {
...@@ -98,15 +95,13 @@ void mainloop() { ...@@ -98,15 +95,13 @@ void mainloop() {
TB *tb = find_tb(tb_start); TB *tb = find_tb(tb_start);
if (tb == NULL) { if (tb == NULL) {
clear_trans_buffer(); clear_trans_buffer();
spill_reset();
tran_next_pc = NEXT_PC_SEQ; tran_next_pc = NEXT_PC_SEQ;
int guest_nr_instr = 0; int guest_nr_instr = 0;
while (1) { while (1) {
__attribute__((unused)) vaddr_t ori_pc = cpu.pc; __attribute__((unused)) vaddr_t ori_pc = cpu.pc;
__attribute__((unused)) vaddr_t seq_pc = isa_exec_once(); __attribute__((unused)) vaddr_t seq_pc = isa_exec_once();
guest_nr_instr ++; guest_nr_instr ++;
#ifdef REG_SPILLING
spill_flush_all();
#endif
if (nemu_state.state != NEMU_RUNNING) tran_next_pc = NEXT_PC_END; if (nemu_state.state != NEMU_RUNNING) tran_next_pc = NEXT_PC_END;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册