From bfbf18688beec811b9e936908db12e0ca1671430 Mon Sep 17 00:00:00 2001 From: ptitSeb Date: Tue, 27 Aug 2024 18:57:24 +0200 Subject: [ARM64_DYNAREC] Small refactor around get_segdata usage --- src/dynarec/arm64/dynarec_arm64_64.c | 12 ++++++++---- src/dynarec/arm64/dynarec_arm64_helper.c | 14 +++++++------- 2 files changed, 15 insertions(+), 11 deletions(-) (limited to 'src') diff --git a/src/dynarec/arm64/dynarec_arm64_64.c b/src/dynarec/arm64/dynarec_arm64_64.c index 6ff6d594..ca9e584b 100644 --- a/src/dynarec/arm64/dynarec_arm64_64.c +++ b/src/dynarec/arm64/dynarec_arm64_64.c @@ -140,13 +140,14 @@ uintptr_t dynarec64_64(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin INST_NAME("MOVUPS Ex,Gx"); nextop = F8; GETG; - v0 = sse_get_reg(dyn, ninst, x1, gd, 0); if(MODREG) { + v0 = sse_get_reg(dyn, ninst, x1, gd, 0); ed = (nextop&7)+(rex.b<<3); v1 = sse_get_reg_empty(dyn, ninst, x1, ed); VMOVQ(v1, v0); } else { grab_segdata(dyn, addr, ninst, x4, seg); + v0 = sse_get_reg(dyn, ninst, x1, gd, 0); addr = geted(dyn, addr, ninst, nextop, &ed, x1, &fixedaddress, &unscaled, 0xfff<<4, 15, rex, NULL, 0, 0); ADDz_REG(x4, x4, ed); VST128(v0, x4, fixedaddress); @@ -157,13 +158,14 @@ uintptr_t dynarec64_64(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin INST_NAME("MOVSD Ex, Gx"); nextop = F8; GETG; - v0 = sse_get_reg(dyn, ninst, x1, gd, 0); if(MODREG) { + v0 = sse_get_reg(dyn, ninst, x1, gd, 0); ed = (nextop&7)+ (rex.b<<3); d0 = sse_get_reg(dyn, ninst, x1, ed, 1); VMOVeD(d0, 0, v0, 0); } else { grab_segdata(dyn, addr, ninst, x4, seg); + v0 = sse_get_reg(dyn, ninst, x1, gd, 0); addr = geted(dyn, addr, ninst, nextop, &ed, x1, &fixedaddress, &unscaled, 0xfff<<3, 7, rex, NULL, 0, 0); ADDz_REG(x4, x4, ed); VST64(v0, x4, fixedaddress); @@ -174,13 +176,14 @@ uintptr_t dynarec64_64(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin INST_NAME("MOVSS Ex, Gx"); nextop = F8; GETG; - v0 = sse_get_reg(dyn, ninst, x1, gd, 0); if(MODREG) { + v0 = sse_get_reg(dyn, ninst, x1, gd, 0); ed = (nextop&7)+ (rex.b<<3); q0 = sse_get_reg(dyn, ninst, x1, ed, 1); VMOVeS(q0, 0, v0, 0); } else { grab_segdata(dyn, addr, ninst, x4, seg); + v0 = sse_get_reg(dyn, ninst, x1, gd, 0); addr = geted(dyn, addr, ninst, nextop, &ed, x1, &fixedaddress, &unscaled, 0xfff<<2, 3, rex, NULL, 0, 0); ADDz_REG(x4, x4, ed); VST32(v0, x4, fixedaddress); @@ -198,12 +201,13 @@ uintptr_t dynarec64_64(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin INST_NAME("MOVDQU Gx,Ex");// no alignment constraint on NEON here, so same as MOVDQA nextop = F8; GETG; - v0 = sse_get_reg_empty(dyn, ninst, x1, gd); if(MODREG) { + v0 = sse_get_reg_empty(dyn, ninst, x1, gd); v1 = sse_get_reg(dyn, ninst, x1, (nextop&7)+(rex.b<<3), 0); VMOVQ(v0, v1); } else { grab_segdata(dyn, addr, ninst, x4, seg); + v0 = sse_get_reg_empty(dyn, ninst, x1, gd); SMREAD(); addr = geted(dyn, addr, ninst, nextop, &ed, x1, &fixedaddress, &unscaled, 0xfff<<4, 15, rex, NULL, 0, 0); ADDz_REG(x4, x4, ed); diff --git a/src/dynarec/arm64/dynarec_arm64_helper.c b/src/dynarec/arm64/dynarec_arm64_helper.c index 506167b3..c33c9aa2 100644 --- a/src/dynarec/arm64/dynarec_arm64_helper.c +++ b/src/dynarec/arm64/dynarec_arm64_helper.c @@ -832,18 +832,18 @@ void grab_segdata(dynarec_arm_t* dyn, uintptr_t addr, int ninst, int reg, int se int64_t j64; MAYUSE(j64); MESSAGE(LOG_DUMP, "Get %s Offset\n", (segment==_FS)?"FS":"GS"); - int t1 = x1, t2 = x4; - if(reg==t1) ++t1; + int t2 = x4; if(reg==t2) ++t2; LDRw_U12(t2, xEmu, offsetof(x64emu_t, segs_serial[segment])); - LDRx_U12(reg, xEmu, offsetof(x64emu_t, segs_offs[segment])); if(segment==_GS) { + LDRx_U12(reg, xEmu, offsetof(x64emu_t, segs_offs[segment])); CBNZw_MARKSEG(t2); // fast check } else { - LDRx_U12(t1, xEmu, offsetof(x64emu_t, context)); - LDRw_U12(t1, t1, offsetof(box64context_t, sel_serial)); - SUBw_REG(t1, t1, t2); - CBZw_MARKSEG(t1); + LDRx_U12(reg, xEmu, offsetof(x64emu_t, context)); + LDRw_U12(reg, reg, offsetof(box64context_t, sel_serial)); + SUBw_REG(t2, reg, t2); + LDRx_U12(reg, xEmu, offsetof(x64emu_t, segs_offs[segment])); + CBZw_MARKSEG(t2); } MOVZw(x1, segment); call_c(dyn, ninst, GetSegmentBaseEmu, t2, reg, 1, 0); -- cgit 1.4.1