about summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2024-08-27 18:57:24 +0200
committerptitSeb <sebastien.chev@gmail.com>2024-08-27 18:57:36 +0200
commitbfbf18688beec811b9e936908db12e0ca1671430 (patch)
tree710b72c42a430e37c7c5968d3d7d8197db40afd5
parent9de694c46bcd665ea6a91cce848d49144e6cec2f (diff)
downloadbox64-bfbf18688beec811b9e936908db12e0ca1671430.tar.gz
box64-bfbf18688beec811b9e936908db12e0ca1671430.zip
[ARM64_DYNAREC] Small refactor around get_segdata usage
-rw-r--r--src/dynarec/arm64/dynarec_arm64_64.c12
-rw-r--r--src/dynarec/arm64/dynarec_arm64_helper.c14
2 files changed, 15 insertions, 11 deletions
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);