From d2607a15ed53f4e894d1a8a2d4a9d4884eb64a9b Mon Sep 17 00:00:00 2001 From: wangkaifan Date: Wed, 15 Apr 2020 09:44:01 +0800 Subject: [PATCH] Eliminate effects of mul when reg-spilling disabled --- src/engine/rv64/rv64-backend/rtl-basic.c | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/src/engine/rv64/rv64-backend/rtl-basic.c b/src/engine/rv64/rv64-backend/rtl-basic.c index 367bbe07..9338c4d1 100644 --- a/src/engine/rv64/rv64-backend/rtl-basic.c +++ b/src/engine/rv64/rv64-backend/rtl-basic.c @@ -169,6 +169,8 @@ make_rtl_compute_reg(idiv_r, remw) # define rv64_mul_hi(c, a, b) TODO() # define rv64_imul_hi(c, a, b) TODO() #else + +#ifdef REG_SPILLING make_rtl(mul_hi, rtlreg_t* dest, const rtlreg_t* src1, const rtlreg_t* src2) { uint32_t idx_src1 = reg_ptr2idx(s, src1); uint32_t idx_src2 = reg_ptr2idx(s, src2); @@ -192,6 +194,27 @@ make_rtl(imul_hi, rtlreg_t* dest, const rtlreg_t* src1, const rtlreg_t* src2) { rv64_addi(idx_dest, tmp0, 0); rv64_srai(idx_dest, idx_dest, 32); } +#else +make_rtl(mul_hi, rtlreg_t* dest, const rtlreg_t* src1, const rtlreg_t* src2) { + uint32_t idx_dest = reg_ptr2idx(s, dest); + uint32_t idx_src1 = reg_ptr2idx(s, src1); + uint32_t idx_src2 = reg_ptr2idx(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 = reg_ptr2idx(s, dest); + uint32_t idx_src1 = reg_ptr2idx(s, src1); + uint32_t idx_src2 = reg_ptr2idx(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 make_rtl(div64_q, rtlreg_t* dest, -- GitLab