diff --git a/include/rtl/c_op.h b/include/rtl/c_op.h index b2663a02367d6b3419b030cecaf5eb7e581c1d6a..2990187fa9c01581588393bf095b1de449e582d4 100644 --- a/include/rtl/c_op.h +++ b/include/rtl/c_op.h @@ -8,20 +8,21 @@ #define c_xor(a, b) ((a) ^ (b)) #define c_shl(a, b) ((a) << (b)) #define c_shr(a, b) ((a) >> (b)) -#define c_shr64(a, b) ((uint32_t)(a) >> (b)) -#define c_sar(a, b) ((int32_t)(a) >> (b)) -#define c_sar64(a, b) ((int64_t)(a) >> (b)) +#define c_sar(a, b) ((sword_t)(a) >> (b)) + #define c_mul_lo(a, b) ((a) * (b)) -#define c_mul_hi(a, b) (((uint64_t)(a) * (uint64_t)(b)) >> 32) -#define c_imul_lo(a, b) ((int32_t)(a) * (int32_t)(b)) -#define c_imul_hi(a, b) (((int64_t)(int32_t)(a) * (int64_t)(int32_t)(b)) >> 32) +#define c_imul_lo(a, b) ((sword_t)(a) * (sword_t)(b)) +#ifdef ISA64 +# define c_mul_hi(a, b) (((__uint128_t)(a) * (__uint128_t)(b)) >> 64) +# define c_imul_hi(a, b) (((__int128_t)(sword_t)(a) * (__int128_t)(sword_t)(b)) >> 64) +#else +# define c_mul_hi(a, b) (((uint64_t)(a) * (uint64_t)(b)) >> 32) +# define c_imul_hi(a, b) (((int64_t)(sword_t)(a) * (int64_t)(sword_t)(b)) >> 32) +#endif + #define c_div_q(a, b) ((a) / (b)) -#define c_div_q64(a, b) (((a) & 0xffffffff) / ((b) & 0xffffffff)) #define c_div_r(a, b) ((a) % (b)) -#define c_div_r64(a, b) (((a) & 0xffffffff) % ((b) & 0xffffffff)) -#define c_idiv_q(a, b) ((int32_t)(a) / (int32_t)(b)) -#define c_idiv_q64(a, b) ((int32_t)((uint32_t)((a) & 0xffffffff)) / (int32_t)((uint32_t)((b) & 0xffffffff))) -#define c_idiv_r(a, b) ((int32_t)(a) % (int32_t)(b)) -#define c_idiv_r64(a, b) ((int32_t)((uint32_t)((a) & 0xffffffff)) % (int32_t)((uint32_t)((b) & 0xffffffff))) +#define c_idiv_q(a, b) ((sword_t)(a) / (sword_t)(b)) +#define c_idiv_r(a, b) ((sword_t)(a) % (sword_t)(b)) #endif diff --git a/include/rtl/rtl-wrapper.h b/include/rtl/rtl-wrapper.h index cbc3b0a890ab636483f445edb6fcff6261170365..c79472fd1da1684660bff8c287d357530a6bc33f 100644 --- a/include/rtl/rtl-wrapper.h +++ b/include/rtl/rtl-wrapper.h @@ -14,21 +14,15 @@ #define rtl_xor concat(RTL_PREFIX, _rtl_xor ) #define rtl_shl concat(RTL_PREFIX, _rtl_shl ) #define rtl_shr concat(RTL_PREFIX, _rtl_shr ) -#define rtl_shr64 concat(RTL_PREFIX, _rtl_shr64 ) #define rtl_sar concat(RTL_PREFIX, _rtl_sar ) -#define rtl_sar64 concat(RTL_PREFIX, _rtl_sar64 ) #define rtl_mul_lo concat(RTL_PREFIX, _rtl_mul_lo ) #define rtl_mul_hi concat(RTL_PREFIX, _rtl_mul_hi ) #define rtl_imul_lo concat(RTL_PREFIX, _rtl_imul_lo ) #define rtl_imul_hi concat(RTL_PREFIX, _rtl_imul_hi ) #define rtl_div_q concat(RTL_PREFIX, _rtl_div_q ) -#define rtl_div_q64 concat(RTL_PREFIX, _rtl_div_q64 ) #define rtl_div_r concat(RTL_PREFIX, _rtl_div_r ) -#define rtl_div_r64 concat(RTL_PREFIX, _rtl_div_r64 ) #define rtl_idiv_q concat(RTL_PREFIX, _rtl_idiv_q ) -#define rtl_idiv_q64 concat(RTL_PREFIX, _rtl_idiv_q64) #define rtl_idiv_r concat(RTL_PREFIX, _rtl_idiv_r ) -#define rtl_idiv_r64 concat(RTL_PREFIX, _rtl_idiv_r64) #define rtl_div64_q concat(RTL_PREFIX, _rtl_div64_q ) #define rtl_div64_r concat(RTL_PREFIX, _rtl_div64_r ) #define rtl_idiv64_q concat(RTL_PREFIX, _rtl_idiv64_q) diff --git a/include/rtl/rtl.h b/include/rtl/rtl.h index 9a3abf4708b1b3996d3adbcd6a8c15e1430d90fb..a5c03278a11a20756810974be83eacfd8d146b80 100644 --- a/include/rtl/rtl.h +++ b/include/rtl/rtl.h @@ -49,15 +49,6 @@ make_rtl_arith_logic(div_r) make_rtl_arith_logic(idiv_q) make_rtl_arith_logic(idiv_r) -#ifdef ISA64 -make_rtl_arith_logic(shr64) -make_rtl_arith_logic(sar64) -make_rtl_arith_logic(div_q64) -make_rtl_arith_logic(div_r64) -make_rtl_arith_logic(idiv_q64) -make_rtl_arith_logic(idiv_r64) -#endif - static inline void interpret_rtl_div64_q(rtlreg_t* dest, const rtlreg_t* src1_hi, const rtlreg_t* src1_lo, const rtlreg_t* src2) { uint64_t dividend = ((uint64_t)(*src1_hi) << 32) | (*src1_lo); @@ -155,7 +146,7 @@ static inline void rtl_sext(rtlreg_t* dest, const rtlreg_t* src1, int width) { } else { assert(width == 1 || width == 2 || width == 4); rtl_shli(dest, src1, (8 - width) * 8); - rtl_sar64i(dest, dest, (8 - width) * 8); + rtl_sari(dest, dest, (8 - width) * 8); } #else if (width == 4) { diff --git a/src/isa/riscv64/exec/compute.c b/src/isa/riscv64/exec/compute.c index 0f53a4ada2755f6aa91f23960146838cfad81efb..301fa3d85b43dc5f368d8774a8e43c128feb5d54 100644 --- a/src/isa/riscv64/exec/compute.c +++ b/src/isa/riscv64/exec/compute.c @@ -117,6 +117,7 @@ make_EHelper(sllw) { } make_EHelper(srlw) { + rtl_andi(&id_src2->val, &id_src2->val, 0x1f); if (decinfo.isa.instr.funct7 == 32) { // sraw rtl_sar(&s0, &id_src->val, &id_src2->val); @@ -125,9 +126,8 @@ make_EHelper(srlw) { } else { // srlw - rtl_andi(&id_src2->val, &id_src2->val, 0x1f); - - rtl_shr64(&s0, &id_src->val, &id_src2->val); + rtl_andi(&id_src->val, &id_src->val, 0xffffffffu); + rtl_shr(&s0, &id_src->val, &id_src2->val); rtl_sext(&s0, &s0, 4); print_asm_template3(srlw); } diff --git a/src/isa/riscv64/exec/muldiv.c b/src/isa/riscv64/exec/muldiv.c index fd546ddc71f0854bae0aaf796cc743ffeed366dc..37da417486952d3b9373891c59454977de48c15e 100644 --- a/src/isa/riscv64/exec/muldiv.c +++ b/src/isa/riscv64/exec/muldiv.c @@ -1,11 +1,7 @@ #include "cpu/exec.h" make_EHelper(mul) { -#ifdef ISA64 rtl_mul_lo(&s0, &id_src->val, &id_src2->val); -#else - rtl_imul_lo(&s0, &id_src->val, &id_src2->val); -#endif rtl_sr(id_dest->reg, &s0, 4); print_asm_template3(mul); @@ -54,7 +50,7 @@ make_EHelper(remu) { } make_EHelper(mulw) { - rtl_imul_lo(&s0, &id_src->val, &id_src2->val); + rtl_mul_lo(&s0, &id_src->val, &id_src2->val); rtl_sext(&s0, &s0, 4); rtl_sr(id_dest->reg, &s0, 4); @@ -62,15 +58,19 @@ make_EHelper(mulw) { } make_EHelper(divw) { - rtl_idiv_q64(&s0, &id_src->val, &id_src2->val); + rtl_sext(&s0, &id_src->val, 4); + rtl_sext(&s1, &id_src2->val, 4); + rtl_idiv_q(&s0, &s0, &s1); rtl_sext(&s0, &s0, 4); rtl_sr(id_dest->reg, &s0, 4); - print_asm_template3(div); + print_asm_template3(divw); } make_EHelper(remw) { - rtl_idiv_r64(&s0, &id_src->val, &id_src2->val); + rtl_sext(&s0, &id_src->val, 4); + rtl_sext(&s1, &id_src2->val, 4); + rtl_idiv_r(&s0, &s0, &s1); rtl_sext(&s0, &s0, 4); rtl_sr(id_dest->reg, &s0, 4); @@ -78,7 +78,9 @@ make_EHelper(remw) { } make_EHelper(divuw) { - rtl_div_q64(&s0, &id_src->val, &id_src2->val); + rtl_andi(&s0, &id_src->val, 0xffffffffu); + rtl_andi(&s1, &id_src2->val, 0xffffffffu); + rtl_div_q(&s0, &s0, &s1); rtl_sext(&s0, &s0, 4); rtl_sr(id_dest->reg, &s0, 4); @@ -86,9 +88,11 @@ make_EHelper(divuw) { } make_EHelper(remuw) { - rtl_idiv_r64(&s0, &id_src->val, &id_src2->val); + rtl_andi(&s0, &id_src->val, 0xffffffffu); + rtl_andi(&s1, &id_src2->val, 0xffffffffu); + rtl_div_r(&s0, &s0, &s1); rtl_sext(&s0, &s0, 4); rtl_sr(id_dest->reg, &s0, 4); print_asm_template3(remuw); -} \ No newline at end of file +}