diff options
| author | Yang Liu <liuyang22@iscas.ac.cn> | 2025-04-28 18:31:15 +0800 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-04-28 12:31:15 +0200 |
| commit | 25de8bd35cb594944afeee3762bc1a11fa3eeebf (patch) | |
| tree | 8b1d5b01b72c63e3a4f04149cd258b108da1858b | |
| parent | 5c9dc159d2531cd04df2e79a843fa6c0fd44f52f (diff) | |
| download | box64-25de8bd35cb594944afeee3762bc1a11fa3eeebf.tar.gz box64-25de8bd35cb594944afeee3762bc1a11fa3eeebf.zip | |
[RV64_DYNAREC] Small optimization to LEA opcode (#2582)
| -rw-r--r-- | src/dynarec/rv64/dynarec_rv64_00_2.c | 7 | ||||
| -rw-r--r-- | src/dynarec/rv64/dynarec_rv64_helper.c | 8 | ||||
| -rw-r--r-- | src/dynarec/rv64/rv64_printer.c | 2 |
3 files changed, 9 insertions, 8 deletions
diff --git a/src/dynarec/rv64/dynarec_rv64_00_2.c b/src/dynarec/rv64/dynarec_rv64_00_2.c index 71a93184..f8103fa3 100644 --- a/src/dynarec/rv64/dynarec_rv64_00_2.c +++ b/src/dynarec/rv64/dynarec_rv64_00_2.c @@ -486,9 +486,10 @@ uintptr_t dynarec64_00_2(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int if (MODREG) { // reg <= reg? that's an invalid operation DEFAULT; } else { // mem <= reg - addr = geted(dyn, addr, ninst, nextop, &ed, x2, x1, &fixedaddress, rex, NULL, 0, 0); - if (gd != ed) { MV(gd, ed); } - if (!rex.w || rex.is32bits) { + addr = geted(dyn, addr, ninst, nextop, &ed, gd, x1, &fixedaddress, rex, NULL, 0, 0); + if (gd != ed) { + MVxw(gd, ed); + } else if (!rex.w && !rex.is32bits) { ZEROUP(gd); // truncate the higher 32bits as asked } } diff --git a/src/dynarec/rv64/dynarec_rv64_helper.c b/src/dynarec/rv64/dynarec_rv64_helper.c index 361844bb..f436ea18 100644 --- a/src/dynarec/rv64/dynarec_rv64_helper.c +++ b/src/dynarec/rv64/dynarec_rv64_helper.c @@ -223,8 +223,8 @@ static uintptr_t geted_32(dynarec_rv64_t* dyn, uintptr_t addr, int ninst, uint8_ } else { if (sib_reg != 4) { if ((sib >> 6)) { - SLLI(ret, TO_NAT(sib_reg), (sib >> 6)); - ADDW(ret, ret, TO_NAT(sib_reg2)); + SLLI(scratch, TO_NAT(sib_reg), (sib >> 6)); + ADDW(ret, scratch, TO_NAT(sib_reg2)); } else { ADDW(ret, TO_NAT(sib_reg2), TO_NAT(sib_reg)); } @@ -266,8 +266,8 @@ static uintptr_t geted_32(dynarec_rv64_t* dyn, uintptr_t addr, int ninst, uint8_ if ((nextop & 7) == 4) { if (sib_reg != 4) { if (sib >> 6) { - SLLI(ret, TO_NAT(sib_reg), (sib >> 6)); - ADDW(ret, ret, TO_NAT(sib_reg2)); + SLLI(scratch, TO_NAT(sib_reg), (sib >> 6)); + ADDW(ret, scratch, TO_NAT(sib_reg2)); } else { ADDW(ret, TO_NAT(sib_reg2), TO_NAT(sib_reg)); } diff --git a/src/dynarec/rv64/rv64_printer.c b/src/dynarec/rv64/rv64_printer.c index 3c922888..69722783 100644 --- a/src/dynarec/rv64/rv64_printer.c +++ b/src/dynarec/rv64/rv64_printer.c @@ -948,7 +948,7 @@ const char* rv64_print(uint32_t opcode, uintptr_t addr) } // MV - if ((opcode & 0x0000007f) == 0x00000013) { + if ((opcode & 0xfff0707f) == 0x00000013) { a.rd = FX(opcode, 11, 7); a.rs1 = FX(opcode, 19, 15); snprintf(buff, sizeof(buff), "%-15s %s, %s", "MV", gpr[a.rd], gpr[a.rs1]); |