diff --git a/include/rtl/pseudo.h b/include/rtl/pseudo.h index eab7a6fa9f70818c15d097c04fbffaa7d810114b..9aff818c7624d3e6d4b33fd1fa1c6273a97382dc 100644 --- a/include/rtl/pseudo.h +++ b/include/rtl/pseudo.h @@ -41,6 +41,20 @@ static inline make_rtl(sext, rtlreg_t* dest, const rtlreg_t* src1, int width) { } } +static inline make_rtl(zext, rtlreg_t* dest, const rtlreg_t* src1, int width) { + // dest <- zeroext(src1[(width * 8 - 1) .. 0]) +// TODO(); + + const int word_size = sizeof(word_t); + if (width == word_size) { + rtl_mv(s, dest, src1); + } else { + assert(width == 1 || width == 2 || width == 4); + rtl_shli(s, dest, src1, (word_size - width) * 8); + rtl_shri(s, dest, dest, (word_size - width) * 8); + } +} + static inline make_rtl(msb, rtlreg_t* dest, const rtlreg_t* src1, int width) { // dest <- src1[width * 8 - 1] // TODO(); diff --git a/src/isa/riscv64/exec/compute.h b/src/isa/riscv64/exec/compute.h index b95c95a62320136cecf48ecfb00d90101da51c45..091bc45a4038c8754dd47b4687bf69ab41b127cc 100644 --- a/src/isa/riscv64/exec/compute.h +++ b/src/isa/riscv64/exec/compute.h @@ -145,7 +145,7 @@ static inline make_EHelper(srlw) { } else { // srlw - rtl_andi(s, s1, dsrc1, 0xffffffffu); + rtl_zext(s, s1, dsrc1, 4); rtl_shr(s, s0, s1, s0); print_asm_template3(srlw); } @@ -178,7 +178,7 @@ static inline make_EHelper(srliw) { } else { // srlw - rtl_andi(s, s0, dsrc1, 0xffffffffu); + rtl_zext(s, s0, dsrc1, 4); rtl_shri(s, s0, s0, id_src2->imm & 0x1f); print_asm_template3(srliw); } diff --git a/src/isa/riscv64/exec/muldiv.h b/src/isa/riscv64/exec/muldiv.h index 2de209b63becabc67949faa27a8dbcabeb6821a1..d4068da7dd49fc3f66e8db0f3f93930f12366b5f 100644 --- a/src/isa/riscv64/exec/muldiv.h +++ b/src/isa/riscv64/exec/muldiv.h @@ -117,8 +117,8 @@ static inline make_EHelper(remw) { } static inline make_EHelper(divuw) { - rtl_andi(s, s0, dsrc1, 0xffffffffu); - rtl_andi(s, s1, dsrc2, 0xffffffffu); + rtl_zext(s, s0, dsrc1, 4); + rtl_zext(s, s1, dsrc2, 4); if (*s1 == 0) { rtl_li(s, s0, ~0lu); } else { @@ -130,8 +130,8 @@ static inline make_EHelper(divuw) { } static inline make_EHelper(remuw) { - rtl_andi(s, s0, dsrc1, 0xffffffffu); - rtl_andi(s, s1, dsrc2, 0xffffffffu); + rtl_zext(s, s0, dsrc1, 4); + rtl_zext(s, s1, dsrc2, 4); if (*s1 == 0) { //rtl_mv(s, s0, s0); } else {