about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorYang Liu <liuyang22@iscas.ac.cn>2025-02-07 16:38:30 +0800
committerGitHub <noreply@github.com>2025-02-07 09:38:30 +0100
commit37697e2ec7484a9bcc00d70a46147365121617a1 (patch)
treeed7ca5a43d8a493ce537776d6de38ce092d2c932 /src
parentf5eb3c1e9bd0269d8f80d382f1c24cad043fae91 (diff)
downloadbox64-37697e2ec7484a9bcc00d70a46147365121617a1.tar.gz
box64-37697e2ec7484a9bcc00d70a46147365121617a1.zip
[DYNAREC] Optimized grab_segdata calls on MODREG (#2319)
Diffstat (limited to 'src')
-rw-r--r--src/dynarec/arm64/dynarec_arm64_64.c106
-rw-r--r--src/dynarec/arm64/dynarec_arm64_6664.c28
-rw-r--r--src/dynarec/arm64/dynarec_arm64_6764_32.c12
-rw-r--r--src/dynarec/arm64/dynarec_arm64_helper.c3
-rw-r--r--src/dynarec/arm64/dynarec_arm64_helper.h2
-rw-r--r--src/dynarec/la64/dynarec_la64_64.c38
-rw-r--r--src/dynarec/la64/dynarec_la64_6664.c2
-rw-r--r--src/dynarec/la64/dynarec_la64_helper.c3
-rw-r--r--src/dynarec/la64/dynarec_la64_helper.h2
-rw-r--r--src/dynarec/rv64/dynarec_rv64_64.c50
-rw-r--r--src/dynarec/rv64/dynarec_rv64_6664.c4
-rw-r--r--src/dynarec/rv64/dynarec_rv64_helper.c3
-rw-r--r--src/dynarec/rv64/dynarec_rv64_helper.h2
13 files changed, 129 insertions, 126 deletions
diff --git a/src/dynarec/arm64/dynarec_arm64_64.c b/src/dynarec/arm64/dynarec_arm64_64.c
index 70ebf7dc..64421bcd 100644
--- a/src/dynarec/arm64/dynarec_arm64_64.c
+++ b/src/dynarec/arm64/dynarec_arm64_64.c
@@ -61,8 +61,8 @@ uintptr_t dynarec64_64(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
         case 0x01:
             INST_NAME("ADD Seg:Ed, Gd");
             SETFLAGS(X_ALL, SF_SET_PENDING);
-            grab_segdata(dyn, addr, ninst, x4, seg);
             nextop = F8;
+            grab_segdata(dyn, addr, ninst, x4, seg, (MODREG));
             GETGD;
             GETEDO(x4, 0);
             emit_add32(dyn, ninst, rex, ed, gd, x3, x5);
@@ -71,8 +71,8 @@ uintptr_t dynarec64_64(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
         case 0x03:
             INST_NAME("ADD Gd, Seg:Ed");
             SETFLAGS(X_ALL, SF_SET_PENDING);
-            grab_segdata(dyn, addr, ninst, x4, seg);
             nextop = F8;
+            grab_segdata(dyn, addr, ninst, x4, seg, (MODREG));
             GETGD;
             GETEDO(x4, 0);
             emit_add32(dyn, ninst, rex, gd, ed, x3, x4);
@@ -81,8 +81,8 @@ uintptr_t dynarec64_64(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
         case 0x0B:
             INST_NAME("OR Gd, Seg:Ed");
             SETFLAGS(X_ALL, SF_SET_PENDING);
-            grab_segdata(dyn, addr, ninst, x4, seg);
             nextop = F8;
+            grab_segdata(dyn, addr, ninst, x4, seg, (MODREG));
             GETGD;
             GETEDO(x4, 0);
             emit_or32(dyn, ninst, rex, gd, ed, x3, x4);
@@ -104,7 +104,7 @@ uintptr_t dynarec64_64(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                                 d0 = sse_get_reg(dyn, ninst, x1, ed, 0);
                                 VMOVeD(v0, 0, d0, 0);
                             } else {
-                                grab_segdata(dyn, addr, ninst, x4, seg);
+                                grab_segdata(dyn, addr, ninst, x4, seg, (MODREG));
                                 v0 = sse_get_reg_empty(dyn, ninst, x1, gd);
                                 SMREAD();
                                 addr = geted(dyn, addr, ninst, nextop, &ed, x1, &fixedaddress, &unscaled, 0xfff<<3, 7, rex, NULL, 0, 0);
@@ -122,7 +122,7 @@ uintptr_t dynarec64_64(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                                 q0 = sse_get_reg(dyn, ninst, x1, ed, 0);
                                 VMOVeS(v0, 0, q0, 0);
                             } else {
-                                grab_segdata(dyn, addr, ninst, x4, seg);
+                                grab_segdata(dyn, addr, ninst, x4, seg, (MODREG));
                                 v0 = sse_get_reg_empty(dyn, ninst, x1, gd);
                                 SMREAD();
                                 addr = geted(dyn, addr, ninst, nextop, &ed, x1, &fixedaddress, &unscaled, 0xfff<<2, 3, rex, NULL, 0, 0);
@@ -146,7 +146,7 @@ uintptr_t dynarec64_64(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                                 v1 = sse_get_reg_empty(dyn, ninst, x1, ed);
                                 VMOVQ(v1, v0);
                             } else {
-                                grab_segdata(dyn, addr, ninst, x4, seg);
+                                grab_segdata(dyn, addr, ninst, x4, seg, (MODREG));
                                 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);
@@ -164,7 +164,7 @@ uintptr_t dynarec64_64(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                                 d0 = sse_get_reg(dyn, ninst, x1, ed, 1);
                                 VMOVeD(d0, 0, v0, 0);
                             } else {
-                                grab_segdata(dyn, addr, ninst, x4, seg);
+                                grab_segdata(dyn, addr, ninst, x4, seg, (MODREG));
                                 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);
@@ -182,7 +182,7 @@ uintptr_t dynarec64_64(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                                 q0 = sse_get_reg(dyn, ninst, x1, ed, 1);
                                 VMOVeS(q0, 0, v0, 0);
                             } else {
-                                grab_segdata(dyn, addr, ninst, x4, seg);
+                                grab_segdata(dyn, addr, ninst, x4, seg, (MODREG));
                                 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);
@@ -206,7 +206,7 @@ uintptr_t dynarec64_64(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                                 v1 = sse_get_reg(dyn, ninst, x1, (nextop&7)+(rex.b<<3), 0);
                                 VMOVQ(v0, v1);
                             } else {
-                                grab_segdata(dyn, addr, ninst, x4, seg);
+                                grab_segdata(dyn, addr, ninst, x4, seg, (MODREG));
                                 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);
@@ -230,7 +230,7 @@ uintptr_t dynarec64_64(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                                 v1 = sse_get_reg_empty(dyn, ninst, x1, ed);
                                 VMOVQ(v1, v0);
                             } else {
-                                grab_segdata(dyn, addr, ninst, x4, seg);
+                                grab_segdata(dyn, addr, ninst, x4, seg, (MODREG));
                                 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);
@@ -253,7 +253,7 @@ uintptr_t dynarec64_64(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                                 v1 = sse_get_reg(dyn, ninst, x1, (nextop&7)+(rex.b<<3), 0);
                                 VMOVQ(v0, v1);
                             } else {
-                                grab_segdata(dyn, addr, ninst, x4, seg);
+                                grab_segdata(dyn, addr, ninst, x4, seg, (MODREG));
                                 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);
@@ -273,7 +273,7 @@ uintptr_t dynarec64_64(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                             INST_NAME("IMUL Gd, Ed");
                             SETFLAGS(X_ALL, SF_SET);
                             nextop = F8;
-                            grab_segdata(dyn, addr, ninst, x4, seg);
+                            grab_segdata(dyn, addr, ninst, x4, seg, (MODREG));
                             GETGD;
                             GETEDO(x4, 0);
                             if(rex.w) {
@@ -336,7 +336,7 @@ uintptr_t dynarec64_64(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                         case 0:
                             INST_NAME("MOVZX Gd, Eb");
                             nextop = F8;
-                            grab_segdata(dyn, addr, ninst, x4, seg);
+                            grab_segdata(dyn, addr, ninst, x4, seg, (MODREG));
                             GETGD;
                             if(MODREG) {
                                 if(rex.rex) {
@@ -368,8 +368,8 @@ uintptr_t dynarec64_64(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
             INST_NAME("ADC Gd, Seg:Ed");
             READFLAGS(X_CF);
             SETFLAGS(X_ALL, SF_SET_PENDING);
-            grab_segdata(dyn, addr, ninst, x4, seg);
             nextop = F8;
+            grab_segdata(dyn, addr, ninst, x4, seg, (MODREG));
             GETGD;
             GETEDO(x4, 0);
             emit_adc32(dyn, ninst, rex, gd, ed, x3, x5);
@@ -379,8 +379,8 @@ uintptr_t dynarec64_64(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
             INST_NAME("SBB Gd, Seg:Ed");
             READFLAGS(X_CF);
             SETFLAGS(X_ALL, SF_SET_PENDING);
-            grab_segdata(dyn, addr, ninst, x4, seg);
             nextop = F8;
+            grab_segdata(dyn, addr, ninst, x4, seg, (MODREG));
             GETGD;
             GETEDO(x4, 0);
             emit_sbb32(dyn, ninst, rex, gd, ed, x3, x5);
@@ -389,8 +389,8 @@ uintptr_t dynarec64_64(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
         case 0x21:
             INST_NAME("AND Seg:Ed, Gd");
             SETFLAGS(X_ALL, SF_SET_PENDING);
-            grab_segdata(dyn, addr, ninst, x4, seg);
             nextop = F8;
+            grab_segdata(dyn, addr, ninst, x4, seg, (MODREG));
             GETGD;
             GETEDO(x4, 0);
             emit_and32(dyn, ninst, rex, ed, gd, x3, x5);
@@ -400,8 +400,8 @@ uintptr_t dynarec64_64(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
         case 0x23:
             INST_NAME("AND Gd, Seg:Ed");
             SETFLAGS(X_ALL, SF_SET_PENDING);
-            grab_segdata(dyn, addr, ninst, x4, seg);
             nextop = F8;
+            grab_segdata(dyn, addr, ninst, x4, seg, (MODREG));
             GETGD;
             GETEDO(x4, 0);
             emit_and32(dyn, ninst, rex, gd, ed, x3, x5);
@@ -410,8 +410,8 @@ uintptr_t dynarec64_64(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
         case 0x29:
             INST_NAME("SUB Seg:Ed, Gd");
             SETFLAGS(X_ALL, SF_SET_PENDING);
-            grab_segdata(dyn, addr, ninst, x4, seg);
             nextop = F8;
+            grab_segdata(dyn, addr, ninst, x4, seg, (MODREG));
             GETGD;
             GETEDO(x4, 0);
             emit_sub32(dyn, ninst, rex, ed, gd, x3, x5);
@@ -421,8 +421,8 @@ uintptr_t dynarec64_64(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
         case 0x2B:
             INST_NAME("SUB Gd, Seg:Ed");
             SETFLAGS(X_ALL, SF_SET_PENDING);
-            grab_segdata(dyn, addr, ninst, x4, seg);
             nextop = F8;
+            grab_segdata(dyn, addr, ninst, x4, seg, (MODREG));
             GETGD;
             GETEDO(x4, 0);
             emit_sub32(dyn, ninst, rex, gd, ed, x3, x4);
@@ -431,8 +431,8 @@ uintptr_t dynarec64_64(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
         case 0x31:
             INST_NAME("XOR Seg:Ed, Gd");
             SETFLAGS(X_ALL, SF_SET_PENDING);
-            grab_segdata(dyn, addr, ninst, x4, seg);
             nextop = F8;
+            grab_segdata(dyn, addr, ninst, x4, seg, (MODREG));
             GETGD;
             GETEDO(x4, 0);
             emit_xor32(dyn, ninst, rex, ed, gd, x3, x5);
@@ -442,8 +442,8 @@ uintptr_t dynarec64_64(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
         case 0x33:
             INST_NAME("XOR Gd, Seg:Ed");
             SETFLAGS(X_ALL, SF_SET_PENDING);
-            grab_segdata(dyn, addr, ninst, x4, seg);
             nextop = F8;
+            grab_segdata(dyn, addr, ninst, x4, seg, (MODREG));
             GETGD;
             GETEDO(x4, 0);
             emit_xor32(dyn, ninst, rex, gd, ed, x3, x4);
@@ -452,8 +452,8 @@ uintptr_t dynarec64_64(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
         case 0x39:
             INST_NAME("CMP Seg:Ed, Gd");
             SETFLAGS(X_ALL, SF_SET_PENDING);
-            grab_segdata(dyn, addr, ninst, x4, seg);
             nextop = F8;
+            grab_segdata(dyn, addr, ninst, x4, seg, (MODREG));
             GETGD;
             GETEDO(x4, 0);
             emit_cmp32(dyn, ninst, rex, ed, gd, x3, x4, x5);
@@ -462,8 +462,8 @@ uintptr_t dynarec64_64(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
         case 0x3B:
             INST_NAME("CMP Gd, Seg:Ed");
             SETFLAGS(X_ALL, SF_SET_PENDING);
-            grab_segdata(dyn, addr, ninst, x4, seg);
             nextop = F8;
+            grab_segdata(dyn, addr, ninst, x4, seg, (MODREG));
             GETGD;
             GETEDO(x4, 0);
             emit_cmp32(dyn, ninst, rex, gd, ed, x3, x4, x5);
@@ -500,7 +500,7 @@ uintptr_t dynarec64_64(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                     if(MODREG) {   // reg <= reg
                         SXTWx(gd, TO_NAT((nextop & 7) + (rex.b << 3)));
                     } else {                    // mem <= reg
-                        grab_segdata(dyn, addr, ninst, x4, seg);
+                        grab_segdata(dyn, addr, ninst, x4, seg, (MODREG));
                         SMREAD();
                         addr = geted(dyn, addr, ninst, nextop, &ed, x2, &fixedaddress, NULL, 0, 0, rex, NULL, 0, 0);
                         LDRSW_REGz(gd, x4, ed);
@@ -509,7 +509,7 @@ uintptr_t dynarec64_64(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                     if(MODREG) {   // reg <= reg
                         MOVw_REG(gd, TO_NAT((nextop & 7) + (rex.b << 3)));
                     } else {                    // mem <= reg
-                        grab_segdata(dyn, addr, ninst, x4, seg);
+                        grab_segdata(dyn, addr, ninst, x4, seg, (MODREG));
                         SMREAD();
                         addr = geted(dyn, addr, ninst, nextop, &ed, x2, &fixedaddress, NULL, 0, 0, rex, NULL, 0, 0);
                         LDRw_REGz(gd, x4, ed);
@@ -538,7 +538,7 @@ uintptr_t dynarec64_64(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
             INST_NAME("IMUL Gd, Ed, Id");
             SETFLAGS(X_ALL, SF_SET);
             nextop = F8;
-            grab_segdata(dyn, addr, ninst, x4, seg);
+            grab_segdata(dyn, addr, ninst, x4, seg, (MODREG));
             GETGD;
             GETEDO(x4, 4);
             i64 = F32S;
@@ -650,7 +650,7 @@ uintptr_t dynarec64_64(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
             switch((nextop>>3)&7) {
                 case 0: //ADD
                     INST_NAME("ADD Eb, Ib");
-                    grab_segdata(dyn, addr, ninst, x1, seg);
+                    grab_segdata(dyn, addr, ninst, x1, seg, (MODREG));
                     SETFLAGS(X_ALL, SF_SET_PENDING);
                     GETEBO(x1, 1);
                     u8 = F8;
@@ -659,7 +659,7 @@ uintptr_t dynarec64_64(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                     break;
                 case 1: //OR
                     INST_NAME("OR Eb, Ib");
-                    grab_segdata(dyn, addr, ninst, x1, seg);
+                    grab_segdata(dyn, addr, ninst, x1, seg, (MODREG));
                     SETFLAGS(X_ALL, SF_SET_PENDING);
                     GETEBO(x1, 1);
                     u8 = F8;
@@ -668,7 +668,7 @@ uintptr_t dynarec64_64(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                     break;
                 case 2: //ADC
                     INST_NAME("ADC Eb, Ib");
-                    grab_segdata(dyn, addr, ninst, x1, seg);
+                    grab_segdata(dyn, addr, ninst, x1, seg, (MODREG));
                     READFLAGS(X_CF);
                     SETFLAGS(X_ALL, SF_SET_PENDING);
                     GETEBO(x1, 1);
@@ -678,7 +678,7 @@ uintptr_t dynarec64_64(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                     break;
                 case 3: //SBB
                     INST_NAME("SBB Eb, Ib");
-                    grab_segdata(dyn, addr, ninst, x1, seg);
+                    grab_segdata(dyn, addr, ninst, x1, seg, (MODREG));
                     READFLAGS(X_CF);
                     SETFLAGS(X_ALL, SF_SET_PENDING);
                     GETEBO(x1, 1);
@@ -688,7 +688,7 @@ uintptr_t dynarec64_64(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                     break;
                 case 4: //AND
                     INST_NAME("AND Eb, Ib");
-                    grab_segdata(dyn, addr, ninst, x1, seg);
+                    grab_segdata(dyn, addr, ninst, x1, seg, (MODREG));
                     SETFLAGS(X_ALL, SF_SET_PENDING);
                     GETEBO(x1, 1);
                     u8 = F8;
@@ -697,7 +697,7 @@ uintptr_t dynarec64_64(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                     break;
                 case 5: //SUB
                     INST_NAME("SUB Eb, Ib");
-                    grab_segdata(dyn, addr, ninst, x1, seg);
+                    grab_segdata(dyn, addr, ninst, x1, seg, (MODREG));
                     SETFLAGS(X_ALL, SF_SET_PENDING);
                     GETEBO(x1, 1);
                     u8 = F8;
@@ -706,7 +706,7 @@ uintptr_t dynarec64_64(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                     break;
                 case 6: //XOR
                     INST_NAME("XOR Eb, Ib");
-                    grab_segdata(dyn, addr, ninst, x1, seg);
+                    grab_segdata(dyn, addr, ninst, x1, seg, (MODREG));
                     SETFLAGS(X_ALL, SF_SET_PENDING);
                     GETEBO(x1, 1);
                     u8 = F8;
@@ -715,7 +715,7 @@ uintptr_t dynarec64_64(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                     break;
                 case 7: //CMP
                     INST_NAME("CMP Eb, Ib");
-                    grab_segdata(dyn, addr, ninst, x1, seg);
+                    grab_segdata(dyn, addr, ninst, x1, seg, (MODREG));
                     SETFLAGS(X_ALL, SF_SET_PENDING);
                     GETEBO(x1, 1);
                     u8 = F8;
@@ -733,7 +733,7 @@ uintptr_t dynarec64_64(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
         case 0x81:
         case 0x83:
             nextop = F8;
-            grab_segdata(dyn, addr, ninst, x6, seg);
+            grab_segdata(dyn, addr, ninst, x6, seg, (MODREG));
             switch((nextop>>3)&7) {
                 case 0: //ADD
                     if(opcode==0x81) {INST_NAME("ADD Ed, Id");} else {INST_NAME("ADD Ed, Ib");}
@@ -813,7 +813,7 @@ uintptr_t dynarec64_64(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
             INST_NAME("TEST Ed, Gd");
             SETFLAGS(X_ALL, SF_SET_PENDING);
             nextop=F8;
-            grab_segdata(dyn, addr, ninst, x6, seg);
+            grab_segdata(dyn, addr, ninst, x6, seg, (MODREG));
             GETGD;
             GETEDO(x6, 0);
             emit_test32(dyn, ninst, rex, ed, gd, x3, x5, x6);
@@ -847,15 +847,15 @@ uintptr_t dynarec64_64(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                 }
                 BFIx(eb1, gd, eb2*8, 8);
             } else {
-                grab_segdata(dyn, addr, ninst, x4, seg);
+                grab_segdata(dyn, addr, ninst, x4, seg, (MODREG));
                 addr = geted(dyn, addr, ninst, nextop, &wback, x3, &fixedaddress, NULL, 0, 0, rex, NULL, 0, 0);
                 STRB_REGz(gd, x4, wback);
             }
             break;
         case 0x89:
             INST_NAME("MOV Seg:Ed, Gd");
-            grab_segdata(dyn, addr, ninst, x4, seg);
-            nextop=F8;
+            nextop = F8;
+            grab_segdata(dyn, addr, ninst, x4, seg, (MODREG));
             GETGD;
             if(MODREG) {   // reg <= reg
                 MOVxw_REG(TO_NAT((nextop & 7) + (rex.b << 3)), gd);
@@ -892,7 +892,7 @@ uintptr_t dynarec64_64(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                     ed = wback;
                 }
             } else {
-                grab_segdata(dyn, addr, ninst, x4, seg);
+                grab_segdata(dyn, addr, ninst, x4, seg, (MODREG));
                 SMREAD();
                 addr = geted(dyn, addr, ninst, nextop, &wback, x3, &fixedaddress, NULL, 0, 0, rex, NULL, 0, 0);
                 LDRB_REGz(x4, x4, wback);
@@ -902,8 +902,8 @@ uintptr_t dynarec64_64(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
             break;
         case 0x8B:
             INST_NAME("MOV Gd, Seg:Ed");
-            grab_segdata(dyn, addr, ninst, x4, seg);
-            nextop=F8;
+            nextop = F8;
+            grab_segdata(dyn, addr, ninst, x4, seg, (MODREG));
             GETGD;
             if(MODREG) {   // reg <= reg
                 MOVxw_REG(gd, TO_NAT((nextop & 7) + (rex.b << 3)));
@@ -932,8 +932,8 @@ uintptr_t dynarec64_64(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
             break;
         case 0x8E:
             INST_NAME("MOV Seg,Ew");
-            grab_segdata(dyn, addr, ninst, x4, seg);
             nextop = F8;
+            grab_segdata(dyn, addr, ninst, x4, seg, (MODREG));
             u8 = (nextop&0x38)>>3;
             if (MODREG) {
                 ed = TO_NAT((nextop & 7) + (rex.b << 3));
@@ -948,8 +948,8 @@ uintptr_t dynarec64_64(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
             break;
         case 0x8F:
             INST_NAME("POP FS:Ed");
-            grab_segdata(dyn, addr, ninst, x4, seg);
             nextop = F8;
+            grab_segdata(dyn, addr, ninst, x4, seg, (MODREG));
             if(MODREG) {
                 POP1z(TO_NAT((nextop & 7) + (rex.b << 3)));
             } else {
@@ -987,7 +987,7 @@ uintptr_t dynarec64_64(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
 
         case 0xA1:
             INST_NAME("MOV EAX,FS:Od");
-            grab_segdata(dyn, addr, ninst, x4, seg);
+            grab_segdata(dyn, addr, ninst, x4, seg, 0);
             if(rex.is32bits)
                 u64 = F32;
             else
@@ -997,7 +997,7 @@ uintptr_t dynarec64_64(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
             break;
         case 0xA2:
             INST_NAME("MOV FS:Od,AL");
-            grab_segdata(dyn, addr, ninst, x4, seg);
+            grab_segdata(dyn, addr, ninst, x4, seg, 0);
             if(rex.is32bits)
                 u64 = F32;
             else
@@ -1008,7 +1008,7 @@ uintptr_t dynarec64_64(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
             break;
         case 0xA3:
             INST_NAME("MOV FS:Od,EAX");
-            grab_segdata(dyn, addr, ninst, x4, seg);
+            grab_segdata(dyn, addr, ninst, x4, seg, 0);
             if(rex.is32bits)
                 u64 = F32;
             else
@@ -1028,8 +1028,8 @@ uintptr_t dynarec64_64(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
 
         case 0xC6:
             INST_NAME("MOV Seg:Eb, Ib");
-            grab_segdata(dyn, addr, ninst, x4, seg);
             nextop=F8;
+            grab_segdata(dyn, addr, ninst, x4, seg, (MODREG));
             if(MODREG) {   // reg <= u8
                 u8 = F8;
                 if(!rex.rex) {
@@ -1052,8 +1052,8 @@ uintptr_t dynarec64_64(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
             break;
         case 0xC7:
             INST_NAME("MOV Seg:Ed, Id");
-            grab_segdata(dyn, addr, ninst, x4, seg);
             nextop=F8;
+            grab_segdata(dyn, addr, ninst, x4, seg, (MODREG));
             if(MODREG) {   // reg <= i32
                 i64 = F32S;
                 ed = TO_NAT((nextop & 7) + (rex.b << 3));
@@ -1069,7 +1069,7 @@ uintptr_t dynarec64_64(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
 
         case 0xD1:
             nextop = F8;
-            grab_segdata(dyn, addr, ninst, x6, seg);
+            grab_segdata(dyn, addr, ninst, x6, seg, (MODREG));
             switch((nextop>>3)&7) {
                 case 0:
                     INST_NAME("ROL Ed, 1");
@@ -1127,7 +1127,7 @@ uintptr_t dynarec64_64(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
             break;
         case 0xD3:
             nextop = F8;
-            grab_segdata(dyn, addr, ninst, x6, seg);
+            grab_segdata(dyn, addr, ninst, x6, seg, (MODREG));
             switch((nextop>>3)&7) {
                 case 0:
                     INST_NAME("ROL Ed, CL");
@@ -1271,7 +1271,7 @@ uintptr_t dynarec64_64(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
 
         case 0xF7:
             nextop = F8;
-            grab_segdata(dyn, addr, ninst, x6, seg);
+            grab_segdata(dyn, addr, ninst, x6, seg, (MODREG));
             switch((nextop>>3)&7) {
                 case 0:
                 case 1:
@@ -1513,7 +1513,7 @@ uintptr_t dynarec64_64(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
 
         case 0xFF:
             nextop = F8;
-            grab_segdata(dyn, addr, ninst, x6, seg);
+            grab_segdata(dyn, addr, ninst, x6, seg, (MODREG));
             switch((nextop>>3)&7) {
                 case 0: // INC Ed
                     INST_NAME("INC Ed");
diff --git a/src/dynarec/arm64/dynarec_arm64_6664.c b/src/dynarec/arm64/dynarec_arm64_6664.c
index f2dbee70..87ee3961 100644
--- a/src/dynarec/arm64/dynarec_arm64_6664.c
+++ b/src/dynarec/arm64/dynarec_arm64_6664.c
@@ -58,7 +58,7 @@ uintptr_t dynarec64_6664(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int n
                     if(MODREG) {
                         v1 = sse_get_reg(dyn, ninst, x1, (nextop&7) + (rex.b<<3), 0);
                     } else {
-                        grab_segdata(dyn, addr, ninst, x4, seg);
+                        grab_segdata(dyn, addr, ninst, x4, seg, (MODREG));
                         SMREAD();
                         addr = geted(dyn, addr, ninst, nextop, &ed, x1, &fixedaddress, &unscaled, 0xfff<<3, 7, rex, NULL, 0, 0);
                         ADDz_REG(x4, x4, ed);
@@ -79,7 +79,7 @@ uintptr_t dynarec64_6664(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int n
                         VMOVQ(v0, v1);
                     } else {
                         GETGX_empty(v0);
-                        grab_segdata(dyn, addr, ninst, x4, seg);
+                        grab_segdata(dyn, addr, ninst, x4, seg, (MODREG));
                         addr = geted(dyn, addr, ninst, nextop, &ed, x1, &fixedaddress, &unscaled, 0xfff<<4, 15, rex, NULL, 0, 0);
                         SMREAD();
                         ADDz_REG(x4, x4, ed);
@@ -96,7 +96,7 @@ uintptr_t dynarec64_6664(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int n
                         v1 = sse_get_reg(dyn, ninst, x1, (nextop&7)+(rex.b<<3), 1);
                         VMOVQ(v1, v0);
                     } else {
-                        grab_segdata(dyn, addr, ninst, x4, seg);
+                        grab_segdata(dyn, addr, ninst, x4, seg, (MODREG));
                         addr = geted(dyn, addr, ninst, nextop, &ed, x1, &fixedaddress, &unscaled, 0xfff<<4, 15, rex, NULL, 0, 0);
                         ADDz_REG(x4, x4, ed);
                         ed = x4;
@@ -114,7 +114,7 @@ uintptr_t dynarec64_6664(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int n
                         v1 = sse_get_reg_empty(dyn, ninst, x1, (nextop&7) + (rex.b<<3));
                         FMOVD(v1, v0);
                     } else {
-                        grab_segdata(dyn, addr, ninst, x4, seg);
+                        grab_segdata(dyn, addr, ninst, x4, seg, (MODREG));
                         addr = geted(dyn, addr, ninst, nextop, &ed, x1, &fixedaddress, &unscaled, 0xfff<<3, 7, rex, NULL, 0, 0);
                         ADDz_REG(x4, x4, ed);
                         ed = x4;
@@ -134,7 +134,7 @@ uintptr_t dynarec64_6664(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int n
                 case 0: //ADD
                     if(opcode==0x81) {INST_NAME("ADD Ew, Iw");} else {INST_NAME("ADD Ew, Ib");}
                     SETFLAGS(X_ALL, SF_SET_PENDING);
-                    grab_segdata(dyn, addr, ninst, x1, seg);
+                    grab_segdata(dyn, addr, ninst, x1, seg, (MODREG));
                     GETEWO(x1, (opcode==0x81)?2:1);
                     if(opcode==0x81) i16 = F16S; else i16 = F8S;
                     MOVZw(x5, i16);
@@ -144,7 +144,7 @@ uintptr_t dynarec64_6664(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int n
                 case 1: //OR
                     if(opcode==0x81) {INST_NAME("OR Ew, Iw");} else {INST_NAME("OR Ew, Ib");}
                     SETFLAGS(X_ALL, SF_SET_PENDING);
-                    grab_segdata(dyn, addr, ninst, x1, seg);
+                    grab_segdata(dyn, addr, ninst, x1, seg, (MODREG));
                     GETEWO(x1, (opcode==0x81)?2:1);
                     if(opcode==0x81) i16 = F16S; else i16 = F8S;
                     emit_or16c(dyn, ninst, x1, i16, x2, x4);
@@ -154,7 +154,7 @@ uintptr_t dynarec64_6664(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int n
                     if(opcode==0x81) {INST_NAME("ADC Ew, Iw");} else {INST_NAME("ADC Ew, Ib");}
                     READFLAGS(X_CF);
                     SETFLAGS(X_ALL, SF_SET_PENDING);
-                    grab_segdata(dyn, addr, ninst, x1, seg);
+                    grab_segdata(dyn, addr, ninst, x1, seg, (MODREG));
                     GETEWO(x1, (opcode==0x81)?2:1);
                     if(opcode==0x81) i16 = F16S; else i16 = F8S;
                     MOVZw(x5, i16);
@@ -165,7 +165,7 @@ uintptr_t dynarec64_6664(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int n
                     if(opcode==0x81) {INST_NAME("SBB Ew, Iw");} else {INST_NAME("SBB Ew, Ib");}
                     READFLAGS(X_CF);
                     SETFLAGS(X_ALL, SF_SET_PENDING);
-                    grab_segdata(dyn, addr, ninst, x1, seg);
+                    grab_segdata(dyn, addr, ninst, x1, seg, (MODREG));
                     GETEWO(x1, (opcode==0x81)?2:1);
                     if(opcode==0x81) i16 = F16S; else i16 = F8S;
                     MOVZw(x5, i16);
@@ -175,7 +175,7 @@ uintptr_t dynarec64_6664(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int n
                 case 4: //AND
                     if(opcode==0x81) {INST_NAME("AND Ew, Iw");} else {INST_NAME("AND Ew, Ib");}
                     SETFLAGS(X_ALL, SF_SET_PENDING);
-                    grab_segdata(dyn, addr, ninst, x1, seg);
+                    grab_segdata(dyn, addr, ninst, x1, seg, (MODREG));
                     GETEWO(x1, (opcode==0x81)?2:1);
                     if(opcode==0x81) i16 = F16S; else i16 = F8S;
                     emit_and16c(dyn, ninst, x1, i16, x2, x4);
@@ -184,7 +184,7 @@ uintptr_t dynarec64_6664(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int n
                 case 5: //SUB
                     if(opcode==0x81) {INST_NAME("SUB Ew, Iw");} else {INST_NAME("SUB Ew, Ib");}
                     SETFLAGS(X_ALL, SF_SET_PENDING);
-                    grab_segdata(dyn, addr, ninst, x1, seg);
+                    grab_segdata(dyn, addr, ninst, x1, seg, (MODREG));
                     GETEWO(x1, (opcode==0x81)?2:1);
                     if(opcode==0x81) i16 = F16S; else i16 = F8S;
                     MOVZw(x5, i16);
@@ -194,7 +194,7 @@ uintptr_t dynarec64_6664(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int n
                 case 6: //XOR
                     if(opcode==0x81) {INST_NAME("XOR Ew, Iw");} else {INST_NAME("XOR Ew, Ib");}
                     SETFLAGS(X_ALL, SF_SET_PENDING);
-                    grab_segdata(dyn, addr, ninst, x1, seg);
+                    grab_segdata(dyn, addr, ninst, x1, seg, (MODREG));
                     GETEWO(x1, (opcode==0x81)?2:1);
                     if(opcode==0x81) i16 = F16S; else i16 = F8S;
                     emit_xor16c(dyn, ninst, x1, i16, x2, x4);
@@ -203,7 +203,7 @@ uintptr_t dynarec64_6664(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int n
                 case 7: //CMP
                     if(opcode==0x81) {INST_NAME("CMP Ew, Iw");} else {INST_NAME("CMP Ew, Ib");}
                     SETFLAGS(X_ALL, SF_SET_PENDING);
-                    grab_segdata(dyn, addr, ninst, x1, seg);
+                    grab_segdata(dyn, addr, ninst, x1, seg, (MODREG));
                     GETEWO(x1, (opcode==0x81)?2:1);
                     if(opcode==0x81) i16 = F16S; else i16 = F8S;
                     if(i16) {
@@ -229,7 +229,7 @@ uintptr_t dynarec64_6664(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int n
                     }
                 }
             } else {
-                grab_segdata(dyn, addr, ninst, x4, seg);
+                grab_segdata(dyn, addr, ninst, x4, seg, (MODREG));
                 addr = geted(dyn, addr, ninst, nextop, &ed, x2, &fixedaddress, &unscaled, 0xfff<<(rex.w?3:1), rex.w?7:1, rex, NULL, 0, 0);
                 ADDz_REG(x4, x4, ed);
                 ed = x4;
@@ -256,7 +256,7 @@ uintptr_t dynarec64_6664(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int n
                     }
                 }
             } else {                    // mem <= reg
-                grab_segdata(dyn, addr, ninst, x4, seg);
+                grab_segdata(dyn, addr, ninst, x4, seg, (MODREG));
                 SMREAD();
                 addr = geted(dyn, addr, ninst, nextop, &ed, x2, &fixedaddress, &unscaled, 0xfff<<(rex.w?3:1), rex.w?7:1, rex, NULL, 0, 0);
                 ADDz_REG(x4, x4, ed);
diff --git a/src/dynarec/arm64/dynarec_arm64_6764_32.c b/src/dynarec/arm64/dynarec_arm64_6764_32.c
index 4076c7d3..1a0283f6 100644
--- a/src/dynarec/arm64/dynarec_arm64_6764_32.c
+++ b/src/dynarec/arm64/dynarec_arm64_6764_32.c
@@ -68,7 +68,7 @@ uintptr_t dynarec64_6764_32(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, in
             if(MODREG) {   // reg <= reg
                 MOVxw_REG(TO_NAT((nextop & 7) + (rex.b << 3)), gd);
             } else {                    // mem <= reg
-                grab_segdata(dyn, addr, ninst, x4, seg);
+                grab_segdata(dyn, addr, ninst, x4, seg, (MODREG));
                 addr = geted16(dyn, addr, ninst, nextop, &ed, x2, &fixedaddress, &unscaled, 0xfff<<2, 3, 0);
                 ADDz_REG(x4, x4, ed);
                 STz(gd, x4, fixedaddress);
@@ -82,7 +82,7 @@ uintptr_t dynarec64_6764_32(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, in
             if(MODREG) {   // reg => reg
                 MOVxw_REG(gd, TO_NAT((nextop & 7) + (rex.b << 3)));
             } else {                    // mem => reg
-                grab_segdata(dyn, addr, ninst, x4, seg);
+                grab_segdata(dyn, addr, ninst, x4, seg, (MODREG));
                 addr = geted16(dyn, addr, ninst, nextop, &ed, x2, &fixedaddress, &unscaled, 0xfff<<2, 3, 0);
                 ADDz_REG(x4, x4, ed);
                 LDz(gd, x4, fixedaddress);
@@ -96,7 +96,7 @@ uintptr_t dynarec64_6764_32(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, in
                 POP1_32(x1);
                 MOVxw_REG(TO_NAT((nextop & 7) + (rex.b << 3)), x1);
             } else {                    // mem <= reg
-                grab_segdata(dyn, addr, ninst, x4, seg);
+                grab_segdata(dyn, addr, ninst, x4, seg, (MODREG));
                 POP1_32(x1);
                 addr = geted16(dyn, addr, ninst, nextop, &ed, x2, &fixedaddress, &unscaled, 0xfff<<2, 3, 0);
                 ADDz_REG(x4, x4, ed);
@@ -107,7 +107,7 @@ uintptr_t dynarec64_6764_32(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, in
         case 0xA1:
             INST_NAME("MOV EAX, Seg:[Od]");
             i32 = F16;
-            grab_segdata(dyn, addr, ninst, x4, seg);
+            grab_segdata(dyn, addr, ninst, x4, seg, 0);
             if(i32<4096 && !(i32&3)) {
                 LDRw_U12(xRAX, x4, i32);
             } else if(i32<256) {
@@ -121,7 +121,7 @@ uintptr_t dynarec64_6764_32(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, in
         case 0xA3:
             INST_NAME("MOV Seg:[Od], EAX");
             i32 = F16;
-            grab_segdata(dyn, addr, ninst, x4, seg);
+            grab_segdata(dyn, addr, ninst, x4, seg, 0);
             if(i32<4096 && !(i32&3)) {
                 STRw_U12(xRAX, x4, i32);
             } else if(i32<256) {
@@ -134,7 +134,7 @@ uintptr_t dynarec64_6764_32(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, in
 
         case 0xFF:
             nextop = F8;
-            grab_segdata(dyn, addr, ninst, x4, seg);
+            grab_segdata(dyn, addr, ninst, x4, seg, (MODREG));
             switch((nextop>>3)&7) {
                 case 6: // Push Ed
                     INST_NAME("PUSH FS:Ew");
diff --git a/src/dynarec/arm64/dynarec_arm64_helper.c b/src/dynarec/arm64/dynarec_arm64_helper.c
index 313345e8..4c8680a8 100644
--- a/src/dynarec/arm64/dynarec_arm64_helper.c
+++ b/src/dynarec/arm64/dynarec_arm64_helper.c
@@ -858,11 +858,12 @@ void call_n(dynarec_arm_t* dyn, int ninst, void* fnc, int w)
     //SET_NODF();
 }
 
-void grab_segdata(dynarec_arm_t* dyn, uintptr_t addr, int ninst, int reg, int segment)
+void grab_segdata(dynarec_arm_t* dyn, uintptr_t addr, int ninst, int reg, int segment, int modreg)
 {
     (void)addr;
     int64_t j64;
     MAYUSE(j64);
+    if (modreg) return;
     MESSAGE(LOG_DUMP, "Get %s Offset\n", (segment==_FS)?"FS":"GS");
     int t2 = x4;
     if(reg==t2) ++t2;
diff --git a/src/dynarec/arm64/dynarec_arm64_helper.h b/src/dynarec/arm64/dynarec_arm64_helper.h
index f5a7104f..56b388d4 100644
--- a/src/dynarec/arm64/dynarec_arm64_helper.h
+++ b/src/dynarec/arm64/dynarec_arm64_helper.h
@@ -1433,7 +1433,7 @@ void retn_to_epilog(dynarec_arm_t* dyn, int ninst, rex_t rex, int n);
 void iret_to_epilog(dynarec_arm_t* dyn, int ninst, int is32bits, int is64bits);
 void call_c(dynarec_arm_t* dyn, int ninst, void* fnc, int reg, int ret, int saveflags, int save_reg);
 void call_n(dynarec_arm_t* dyn, int ninst, void* fnc, int w);
-void grab_segdata(dynarec_arm_t* dyn, uintptr_t addr, int ninst, int reg, int segment);
+void grab_segdata(dynarec_arm_t* dyn, uintptr_t addr, int ninst, int reg, int segment, int modreg);
 void emit_cmp8(dynarec_arm_t* dyn, int ninst, int s1, int s2, int s3, int s4, int s5);
 void emit_cmp16(dynarec_arm_t* dyn, int ninst, int s1, int s2, int s3, int s4, int s5);
 void emit_cmp32(dynarec_arm_t* dyn, int ninst, rex_t rex, int s1, int s2, int s3, int s4, int s5);
diff --git a/src/dynarec/la64/dynarec_la64_64.c b/src/dynarec/la64/dynarec_la64_64.c
index a3219ac8..44aced0b 100644
--- a/src/dynarec/la64/dynarec_la64_64.c
+++ b/src/dynarec/la64/dynarec_la64_64.c
@@ -64,8 +64,8 @@ uintptr_t dynarec64_64(dynarec_la64_t* dyn, uintptr_t addr, uintptr_t ip, int ni
         case 0x03:
             INST_NAME("ADD Gd, Seg:Ed");
             SETFLAGS(X_ALL, SF_SET_PENDING, NAT_FLAGS_FUSION);
-            grab_segdata(dyn, addr, ninst, x4, seg);
             nextop = F8;
+            grab_segdata(dyn, addr, ninst, x4, seg, (MODREG));
             GETGD;
             GETEDO(x4, 0);
             emit_add32(dyn, ninst, rex, gd, ed, x3, x4, x5);
@@ -73,8 +73,8 @@ uintptr_t dynarec64_64(dynarec_la64_t* dyn, uintptr_t addr, uintptr_t ip, int ni
         case 0x2B:
             INST_NAME("SUB Gd, Seg:Ed");
             SETFLAGS(X_ALL, SF_SET_PENDING, NAT_FLAGS_FUSION);
-            grab_segdata(dyn, addr, ninst, x4, seg);
             nextop = F8;
+            grab_segdata(dyn, addr, ninst, x4, seg, (MODREG));
             GETGD;
             GETEDO(x4, 0);
             emit_sub32(dyn, ninst, rex, gd, ed, x3, x4, x5);
@@ -82,8 +82,8 @@ uintptr_t dynarec64_64(dynarec_la64_t* dyn, uintptr_t addr, uintptr_t ip, int ni
         case 0x33:
             INST_NAME("XOR Gd, Seg:Ed");
             SETFLAGS(X_ALL, SF_SET_PENDING, NAT_FLAGS_FUSION);
-            grab_segdata(dyn, addr, ninst, x4, seg);
             nextop = F8;
+            grab_segdata(dyn, addr, ninst, x4, seg, (MODREG));
             GETGD;
             GETEDO(x4, 0);
             emit_xor32(dyn, ninst, rex, gd, ed, x3, x4);
@@ -102,7 +102,7 @@ uintptr_t dynarec64_64(dynarec_la64_t* dyn, uintptr_t addr, uintptr_t ip, int ni
             switch ((nextop >> 3) & 7) {
                 case 0: // ADD
                     INST_NAME("ADD Eb, Ib");
-                    grab_segdata(dyn, addr, ninst, x1, seg);
+                    grab_segdata(dyn, addr, ninst, x1, seg, (MODREG));
                     SETFLAGS(X_ALL, SF_SET_PENDING, NAT_FLAGS_FUSION);
                     GETEBO(x1, 1);
                     u8 = F8;
@@ -111,7 +111,7 @@ uintptr_t dynarec64_64(dynarec_la64_t* dyn, uintptr_t addr, uintptr_t ip, int ni
                     break;
                 case 1: // OR
                     INST_NAME("OR Eb, Ib");
-                    grab_segdata(dyn, addr, ninst, x1, seg);
+                    grab_segdata(dyn, addr, ninst, x1, seg, (MODREG));
                     SETFLAGS(X_ALL, SF_SET_PENDING, NAT_FLAGS_FUSION);
                     GETEBO(x1, 1);
                     u8 = F8;
@@ -120,7 +120,7 @@ uintptr_t dynarec64_64(dynarec_la64_t* dyn, uintptr_t addr, uintptr_t ip, int ni
                     break;
                 case 2: // ADC
                     INST_NAME("ADC Eb, Ib");
-                    grab_segdata(dyn, addr, ninst, x1, seg);
+                    grab_segdata(dyn, addr, ninst, x1, seg, (MODREG));
                     READFLAGS(X_CF);
                     SETFLAGS(X_ALL, SF_SET_PENDING, NAT_FLAGS_FUSION);
                     GETEBO(x1, 1);
@@ -130,7 +130,7 @@ uintptr_t dynarec64_64(dynarec_la64_t* dyn, uintptr_t addr, uintptr_t ip, int ni
                     break;
                 case 3: // SBB
                     INST_NAME("SBB Eb, Ib");
-                    grab_segdata(dyn, addr, ninst, x1, seg);
+                    grab_segdata(dyn, addr, ninst, x1, seg, (MODREG));
                     READFLAGS(X_CF);
                     SETFLAGS(X_ALL, SF_SET_PENDING, NAT_FLAGS_FUSION);
                     GETEBO(x1, 1);
@@ -140,7 +140,7 @@ uintptr_t dynarec64_64(dynarec_la64_t* dyn, uintptr_t addr, uintptr_t ip, int ni
                     break;
                 case 4: // AND
                     INST_NAME("AND Eb, Ib");
-                    grab_segdata(dyn, addr, ninst, x1, seg);
+                    grab_segdata(dyn, addr, ninst, x1, seg, (MODREG));
                     SETFLAGS(X_ALL, SF_SET_PENDING, NAT_FLAGS_FUSION);
                     GETEBO(x1, 1);
                     u8 = F8;
@@ -149,7 +149,7 @@ uintptr_t dynarec64_64(dynarec_la64_t* dyn, uintptr_t addr, uintptr_t ip, int ni
                     break;
                 case 5: // SUB
                     INST_NAME("SUB Eb, Ib");
-                    grab_segdata(dyn, addr, ninst, x1, seg);
+                    grab_segdata(dyn, addr, ninst, x1, seg, (MODREG));
                     SETFLAGS(X_ALL, SF_SET_PENDING, NAT_FLAGS_FUSION);
                     GETEBO(x1, 1);
                     u8 = F8;
@@ -158,7 +158,7 @@ uintptr_t dynarec64_64(dynarec_la64_t* dyn, uintptr_t addr, uintptr_t ip, int ni
                     break;
                 case 6: // XOR
                     INST_NAME("XOR Eb, Ib");
-                    grab_segdata(dyn, addr, ninst, x1, seg);
+                    grab_segdata(dyn, addr, ninst, x1, seg, (MODREG));
                     SETFLAGS(X_ALL, SF_SET_PENDING, NAT_FLAGS_FUSION);
                     GETEBO(x1, 1);
                     u8 = F8;
@@ -167,7 +167,7 @@ uintptr_t dynarec64_64(dynarec_la64_t* dyn, uintptr_t addr, uintptr_t ip, int ni
                     break;
                 case 7: // CMP
                     INST_NAME("CMP Eb, Ib");
-                    grab_segdata(dyn, addr, ninst, x1, seg);
+                    grab_segdata(dyn, addr, ninst, x1, seg, (MODREG));
                     SETFLAGS(X_ALL, SF_SET_PENDING, NAT_FLAGS_FUSION);
                     GETEBO(x1, 1);
                     u8 = F8;
@@ -185,7 +185,7 @@ uintptr_t dynarec64_64(dynarec_la64_t* dyn, uintptr_t addr, uintptr_t ip, int ni
         case 0x81:
         case 0x83:
             nextop = F8;
-            grab_segdata(dyn, addr, ninst, x6, seg);
+            grab_segdata(dyn, addr, ninst, x6, seg, (MODREG));
             switch ((nextop >> 3) & 7) {
                 case 0:
                     if (opcode == 0x81) {
@@ -349,15 +349,15 @@ uintptr_t dynarec64_64(dynarec_la64_t* dyn, uintptr_t addr, uintptr_t ip, int ni
                 }
                 BSTRINS_D(eb1, gd, eb2 + 7, eb2);
             } else {
-                grab_segdata(dyn, addr, ninst, x4, seg);
+                grab_segdata(dyn, addr, ninst, x4, seg, (MODREG));
                 addr = geted(dyn, addr, ninst, nextop, &wback, x2, x1, &fixedaddress, rex, NULL, 1, 0);
                 STX_B(gd, x4, wback);
             }
             break;
         case 0x89:
             INST_NAME("MOV Seg:Ed, Gd");
-            grab_segdata(dyn, addr, ninst, x4, seg);
             nextop = F8;
+            grab_segdata(dyn, addr, ninst, x4, seg, (MODREG));
             GETGD;
             if (MODREG) { // reg <= reg
                 MVxw(TO_NAT((nextop & 7) + (rex.b << 3)), gd);
@@ -375,8 +375,8 @@ uintptr_t dynarec64_64(dynarec_la64_t* dyn, uintptr_t addr, uintptr_t ip, int ni
             break;
         case 0x8B:
             INST_NAME("MOV Gd, Seg:Ed");
-            grab_segdata(dyn, addr, ninst, x4, seg);
             nextop = F8;
+            grab_segdata(dyn, addr, ninst, x4, seg, (MODREG));
             GETGD;
             if (MODREG) { // reg <= reg
                 MVxw(gd, TO_NAT((nextop & 7) + (rex.b << 3)));
@@ -394,8 +394,8 @@ uintptr_t dynarec64_64(dynarec_la64_t* dyn, uintptr_t addr, uintptr_t ip, int ni
             break;
         case 0x8E:
             INST_NAME("MOV Seg, Ew");
-            grab_segdata(dyn, addr, ninst, x4, seg);
             nextop = F8;
+            grab_segdata(dyn, addr, ninst, x4, seg, (MODREG));
             u8 = (nextop & 0x38) >> 3;
             if (MODREG) {
                 ed = TO_NAT((nextop & 7) + (rex.b << 3));
@@ -411,7 +411,7 @@ uintptr_t dynarec64_64(dynarec_la64_t* dyn, uintptr_t addr, uintptr_t ip, int ni
             break;
         case 0xA1:
             INST_NAME("MOV EAX, FS:Od");
-            grab_segdata(dyn, addr, ninst, x4, seg);
+            grab_segdata(dyn, addr, ninst, x4, seg, 0);
             if (rex.is32bits)
                 u64 = F32;
             else
@@ -425,8 +425,8 @@ uintptr_t dynarec64_64(dynarec_la64_t* dyn, uintptr_t addr, uintptr_t ip, int ni
             break;
         case 0xC6:
             INST_NAME("MOV Seg:Eb, Ib");
-            grab_segdata(dyn, addr, ninst, x4, seg);
             nextop = F8;
+            grab_segdata(dyn, addr, ninst, x4, seg, (MODREG));
             if (MODREG) { // reg <= u8
                 u8 = F8;
                 if (!rex.rex) {
@@ -458,8 +458,8 @@ uintptr_t dynarec64_64(dynarec_la64_t* dyn, uintptr_t addr, uintptr_t ip, int ni
             break;
         case 0xC7:
             INST_NAME("MOV Seg:Ed, Id");
-            grab_segdata(dyn, addr, ninst, x4, seg);
             nextop = F8;
+            grab_segdata(dyn, addr, ninst, x4, seg, (MODREG));
             if (MODREG) { // reg <= i32
                 i64 = F32S;
                 ed = TO_NAT((nextop & 7) + (rex.b << 3));
diff --git a/src/dynarec/la64/dynarec_la64_6664.c b/src/dynarec/la64/dynarec_la64_6664.c
index 3022d733..15c81000 100644
--- a/src/dynarec/la64/dynarec_la64_6664.c
+++ b/src/dynarec/la64/dynarec_la64_6664.c
@@ -51,7 +51,7 @@ uintptr_t dynarec64_6664(dynarec_la64_t* dyn, uintptr_t addr, uintptr_t ip, int
                     if (ed != gd) BSTRINS_D(gd, ed, 15, 0);
                 }
             } else { // mem <= reg
-                grab_segdata(dyn, addr, ninst, x4, seg);
+                grab_segdata(dyn, addr, ninst, x4, seg, (MODREG));
                 SMREAD();
                 addr = geted(dyn, addr, ninst, nextop, &ed, x2, x1, &fixedaddress, rex, NULL, 1, 0);
                 ADDz(x4, ed, x4);
diff --git a/src/dynarec/la64/dynarec_la64_helper.c b/src/dynarec/la64/dynarec_la64_helper.c
index 627aa698..b807949e 100644
--- a/src/dynarec/la64/dynarec_la64_helper.c
+++ b/src/dynarec/la64/dynarec_la64_helper.c
@@ -760,11 +760,12 @@ void call_c(dynarec_la64_t* dyn, int ninst, void* fnc, int reg, int ret, int sav
     dyn->last_ip = 0;
 }
 
-void grab_segdata(dynarec_la64_t* dyn, uintptr_t addr, int ninst, int reg, int segment)
+void grab_segdata(dynarec_la64_t* dyn, uintptr_t addr, int ninst, int reg, int segment, int modreg)
 {
     (void)addr;
     int64_t j64;
     MAYUSE(j64);
+    if (modreg) return;
     MESSAGE(LOG_DUMP, "Get %s Offset\n", (segment == _FS) ? "FS" : "GS");
     int t1 = x1, t2 = x4;
     if (reg == t1) ++t1;
diff --git a/src/dynarec/la64/dynarec_la64_helper.h b/src/dynarec/la64/dynarec_la64_helper.h
index a109812e..495fa44e 100644
--- a/src/dynarec/la64/dynarec_la64_helper.h
+++ b/src/dynarec/la64/dynarec_la64_helper.h
@@ -950,7 +950,7 @@ void ret_to_epilog(dynarec_la64_t* dyn, int ninst, rex_t rex);
 void retn_to_epilog(dynarec_la64_t* dyn, int ninst, rex_t rex, int n);
 void iret_to_epilog(dynarec_la64_t* dyn, int ninst, int is64bits);
 void call_c(dynarec_la64_t* dyn, int ninst, void* fnc, int reg, int ret, int saveflags, int save_reg);
-void grab_segdata(dynarec_la64_t* dyn, uintptr_t addr, int ninst, int reg, int segment);
+void grab_segdata(dynarec_la64_t* dyn, uintptr_t addr, int ninst, int reg, int segment, int modreg);
 void emit_cmp8(dynarec_la64_t* dyn, int ninst, int s1, int s2, int s3, int s4, int s5, int s6);
 void emit_cmp16(dynarec_la64_t* dyn, int ninst, int s1, int s2, int s3, int s4, int s5, int s6);
 void emit_cmp32(dynarec_la64_t* dyn, int ninst, rex_t rex, int s1, int s2, int s3, int s4, int s5, int s6);
diff --git a/src/dynarec/rv64/dynarec_rv64_64.c b/src/dynarec/rv64/dynarec_rv64_64.c
index 87c2bd61..c7b7885e 100644
--- a/src/dynarec/rv64/dynarec_rv64_64.c
+++ b/src/dynarec/rv64/dynarec_rv64_64.c
@@ -63,8 +63,8 @@ uintptr_t dynarec64_64(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni
         case 0x03:
             INST_NAME("ADD Gd, Seg:Ed");
             SETFLAGS(X_ALL, SF_SET_PENDING, NAT_FLAGS_FUSION);
-            grab_segdata(dyn, addr, ninst, x4, seg);
             nextop = F8;
+            grab_segdata(dyn, addr, ninst, x4, seg, (MODREG));
             GETGD;
             GETEDO(x4, 0, x5);
             emit_add32(dyn, ninst, rex, gd, ed, x3, x4, x5);
@@ -80,7 +80,7 @@ uintptr_t dynarec64_64(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni
                             GETGX();
                             GETEX(x2, 0, 8);
                             if (!MODREG) {
-                                grab_segdata(dyn, addr, ninst, x4, seg);
+                                grab_segdata(dyn, addr, ninst, x4, seg, (MODREG));
                                 ADDz(x4, x4, wback);
                                 wback = x4;
                             }
@@ -101,7 +101,7 @@ uintptr_t dynarec64_64(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni
                                 d0 = sse_get_reg(dyn, ninst, x1, ed, 0);
                                 FMVD(d0, v0);
                             } else {
-                                grab_segdata(dyn, addr, ninst, x4, seg);
+                                grab_segdata(dyn, addr, ninst, x4, seg, (MODREG));
                                 addr = geted(dyn, addr, ninst, nextop, &ed, x1, x2, &fixedaddress, rex, NULL, 1, 0);
                                 ADDz(x4, x4, ed);
                                 ed = x4;
@@ -118,7 +118,7 @@ uintptr_t dynarec64_64(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni
                                 q0 = sse_get_reg(dyn, ninst, x1, (nextop & 7) + (rex.b << 3), 1);
                                 FMVS(q0, v0);
                             } else {
-                                grab_segdata(dyn, addr, ninst, x4, seg);
+                                grab_segdata(dyn, addr, ninst, x4, seg, (MODREG));
                                 addr = geted(dyn, addr, ninst, nextop, &ed, x1, x2, &fixedaddress, rex, NULL, 1, 0);
                                 ADDz(x4, x4, ed);
                                 ed = x4;
@@ -138,8 +138,8 @@ uintptr_t dynarec64_64(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni
         case 0x2B:
             INST_NAME("SUB Gd, Seg:Ed");
             SETFLAGS(X_ALL, SF_SET_PENDING, NAT_FLAGS_FUSION);
-            grab_segdata(dyn, addr, ninst, x4, seg);
             nextop = F8;
+            grab_segdata(dyn, addr, ninst, x4, seg, (MODREG));
             GETGD;
             GETEDO(x4, 0, x5);
             emit_sub32(dyn, ninst, rex, gd, ed, x3, x4, x5);
@@ -148,8 +148,8 @@ uintptr_t dynarec64_64(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni
         case 0x33:
             INST_NAME("XOR Gd, Seg:Ed");
             SETFLAGS(X_ALL, SF_SET_PENDING, NAT_FLAGS_FUSION);
-            grab_segdata(dyn, addr, ninst, x4, seg);
             nextop = F8;
+            grab_segdata(dyn, addr, ninst, x4, seg, (MODREG));
             GETGD;
             GETEDO(x4, 0, x5);
             emit_xor32(dyn, ninst, rex, gd, ed, x3, x4);
@@ -163,7 +163,7 @@ uintptr_t dynarec64_64(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni
             switch ((nextop >> 3) & 7) {
                 case 0: // ADD
                     INST_NAME("ADD Eb, Ib");
-                    grab_segdata(dyn, addr, ninst, x1, seg);
+                    grab_segdata(dyn, addr, ninst, x1, seg, (MODREG));
                     SETFLAGS(X_ALL, SF_SET_PENDING, NAT_FLAGS_FUSION);
                     GETEBO(x1, 1);
                     u8 = F8;
@@ -172,7 +172,7 @@ uintptr_t dynarec64_64(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni
                     break;
                 case 1: // OR
                     INST_NAME("OR Eb, Ib");
-                    grab_segdata(dyn, addr, ninst, x1, seg);
+                    grab_segdata(dyn, addr, ninst, x1, seg, (MODREG));
                     SETFLAGS(X_ALL, SF_SET_PENDING, NAT_FLAGS_FUSION);
                     GETEBO(x1, 1);
                     u8 = F8;
@@ -181,7 +181,7 @@ uintptr_t dynarec64_64(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni
                     break;
                 case 2: // ADC
                     INST_NAME("ADC Eb, Ib");
-                    grab_segdata(dyn, addr, ninst, x1, seg);
+                    grab_segdata(dyn, addr, ninst, x1, seg, (MODREG));
                     READFLAGS(X_CF);
                     SETFLAGS(X_ALL, SF_SET_PENDING, NAT_FLAGS_FUSION);
                     GETEBO(x1, 1);
@@ -191,7 +191,7 @@ uintptr_t dynarec64_64(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni
                     break;
                 case 3: // SBB
                     INST_NAME("SBB Eb, Ib");
-                    grab_segdata(dyn, addr, ninst, x1, seg);
+                    grab_segdata(dyn, addr, ninst, x1, seg, (MODREG));
                     READFLAGS(X_CF);
                     SETFLAGS(X_ALL, SF_SET_PENDING, NAT_FLAGS_FUSION);
                     GETEBO(x1, 1);
@@ -201,7 +201,7 @@ uintptr_t dynarec64_64(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni
                     break;
                 case 4: // AND
                     INST_NAME("AND Eb, Ib");
-                    grab_segdata(dyn, addr, ninst, x1, seg);
+                    grab_segdata(dyn, addr, ninst, x1, seg, (MODREG));
                     SETFLAGS(X_ALL, SF_SET_PENDING, NAT_FLAGS_FUSION);
                     GETEBO(x1, 1);
                     u8 = F8;
@@ -210,7 +210,7 @@ uintptr_t dynarec64_64(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni
                     break;
                 case 5: // SUB
                     INST_NAME("SUB Eb, Ib");
-                    grab_segdata(dyn, addr, ninst, x1, seg);
+                    grab_segdata(dyn, addr, ninst, x1, seg, (MODREG));
                     SETFLAGS(X_ALL, SF_SET_PENDING, NAT_FLAGS_FUSION);
                     GETEBO(x1, 1);
                     u8 = F8;
@@ -219,7 +219,7 @@ uintptr_t dynarec64_64(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni
                     break;
                 case 6: // XOR
                     INST_NAME("XOR Eb, Ib");
-                    grab_segdata(dyn, addr, ninst, x1, seg);
+                    grab_segdata(dyn, addr, ninst, x1, seg, (MODREG));
                     SETFLAGS(X_ALL, SF_SET_PENDING, NAT_FLAGS_FUSION);
                     GETEBO(x1, 1);
                     u8 = F8;
@@ -228,7 +228,7 @@ uintptr_t dynarec64_64(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni
                     break;
                 case 7: // CMP
                     INST_NAME("CMP Eb, Ib");
-                    grab_segdata(dyn, addr, ninst, x1, seg);
+                    grab_segdata(dyn, addr, ninst, x1, seg, (MODREG));
                     SETFLAGS(X_ALL, SF_SET_PENDING, NAT_FLAGS_FUSION);
                     GETEBO(x1, 1);
                     u8 = F8;
@@ -246,7 +246,7 @@ uintptr_t dynarec64_64(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni
         case 0x81:
         case 0x83:
             nextop = F8;
-            grab_segdata(dyn, addr, ninst, x6, seg);
+            grab_segdata(dyn, addr, ninst, x6, seg, (MODREG));
             switch ((nextop >> 3) & 7) {
                 case 0: // ADD
                     if (opcode == 0x81) {
@@ -381,8 +381,8 @@ uintptr_t dynarec64_64(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni
             break;
         case 0x88:
             INST_NAME("MOV Seg:Eb, Gb");
-            grab_segdata(dyn, addr, ninst, x4, seg);
             nextop = F8;
+            grab_segdata(dyn, addr, ninst, x4, seg, (MODREG));
             gd = ((nextop & 0x38) >> 3) + (rex.r << 3);
             if (rex.rex) {
                 gb2 = 0;
@@ -424,8 +424,8 @@ uintptr_t dynarec64_64(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni
             break;
         case 0x89:
             INST_NAME("MOV Seg:Ed, Gd");
-            grab_segdata(dyn, addr, ninst, x4, seg);
             nextop = F8;
+            grab_segdata(dyn, addr, ninst, x4, seg, (MODREG));
             GETGD;
             if (MODREG) { // reg <= reg
                 MVxw(TO_NAT((nextop & 7) + (rex.b << 3)), gd);
@@ -439,8 +439,8 @@ uintptr_t dynarec64_64(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni
 
         case 0x8B:
             INST_NAME("MOV Gd, Seg:Ed");
-            grab_segdata(dyn, addr, ninst, x4, seg);
             nextop = F8;
+            grab_segdata(dyn, addr, ninst, x4, seg, (MODREG));
             GETGD;
             if (MODREG) { // reg <= reg
                 MVxw(gd, TO_NAT((nextop & 7) + (rex.b << 3)));
@@ -453,8 +453,8 @@ uintptr_t dynarec64_64(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni
             break;
         case 0x8E:
             INST_NAME("MOV Seg,Ew");
-            grab_segdata(dyn, addr, ninst, x4, seg);
             nextop = F8;
+            grab_segdata(dyn, addr, ninst, x4, seg, (MODREG));
             u8 = (nextop & 0x38) >> 3;
             if (MODREG) {
                 ed = TO_NAT((nextop & 7) + (rex.b << 3));
@@ -470,8 +470,8 @@ uintptr_t dynarec64_64(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni
             break;
         case 0x8F:
             INST_NAME("POP FS:Ed");
-            grab_segdata(dyn, addr, ninst, x4, seg);
             nextop = F8;
+            grab_segdata(dyn, addr, ninst, x4, seg, (MODREG));
             if (MODREG) {
                 POP1z(TO_NAT((nextop & 7) + (rex.b << 3)));
             } else {
@@ -491,7 +491,7 @@ uintptr_t dynarec64_64(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni
             break;
         case 0xA1:
             INST_NAME("MOV EAX,FS:Od");
-            grab_segdata(dyn, addr, ninst, x4, seg);
+            grab_segdata(dyn, addr, ninst, x4, seg, 0);
             if (rex.is32bits)
                 u64 = F32;
             else
@@ -504,7 +504,7 @@ uintptr_t dynarec64_64(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni
 
         case 0xA3:
             INST_NAME("MOV FS:Od,EAX");
-            grab_segdata(dyn, addr, ninst, x4, seg);
+            grab_segdata(dyn, addr, ninst, x4, seg, 0);
             if (rex.is32bits)
                 u64 = F32;
             else
@@ -518,8 +518,8 @@ uintptr_t dynarec64_64(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni
 
         case 0xC6:
             INST_NAME("MOV Seg:Eb, Ib");
-            grab_segdata(dyn, addr, ninst, x4, seg);
             nextop = F8;
+            grab_segdata(dyn, addr, ninst, x4, seg, (MODREG));
             if (MODREG) { // reg <= u8
                 u8 = F8;
                 if (!rex.rex) {
@@ -565,8 +565,8 @@ uintptr_t dynarec64_64(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni
             break;
         case 0xC7:
             INST_NAME("MOV Seg:Ed, Id");
-            grab_segdata(dyn, addr, ninst, x4, seg);
             nextop = F8;
+            grab_segdata(dyn, addr, ninst, x4, seg, (MODREG));
             if (MODREG) { // reg <= i32
                 i64 = F32S;
                 ed = TO_NAT((nextop & 7) + (rex.b << 3));
@@ -590,7 +590,7 @@ uintptr_t dynarec64_64(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni
             switch ((nextop >> 3) & 7) {
                 case 6: // Push Ed
                     INST_NAME("PUSH Ed");
-                    grab_segdata(dyn, addr, ninst, x6, seg);
+                    grab_segdata(dyn, addr, ninst, x6, seg, (MODREG));
                     GETEDOz(x6, 0, x3);
                     PUSH1z(ed);
                     break;
diff --git a/src/dynarec/rv64/dynarec_rv64_6664.c b/src/dynarec/rv64/dynarec_rv64_6664.c
index a76846ce..2afc198d 100644
--- a/src/dynarec/rv64/dynarec_rv64_6664.c
+++ b/src/dynarec/rv64/dynarec_rv64_6664.c
@@ -55,7 +55,7 @@ uintptr_t dynarec64_6664(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int
                     }
                 }
             } else {
-                grab_segdata(dyn, addr, ninst, x4, seg);
+                grab_segdata(dyn, addr, ninst, x4, seg, (MODREG));
                 addr = geted(dyn, addr, ninst, nextop, &ed, x2, x1, &fixedaddress, rex, NULL, 1, 0);
                 ADDz(x4, ed, x4);
                 if (rex.w) {
@@ -84,7 +84,7 @@ uintptr_t dynarec64_6664(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int
                     }
                 }
             } else { // mem <= reg
-                grab_segdata(dyn, addr, ninst, x4, seg);
+                grab_segdata(dyn, addr, ninst, x4, seg, (MODREG));
                 SMREAD();
                 addr = geted(dyn, addr, ninst, nextop, &ed, x2, x1, &fixedaddress, rex, NULL, 1, 0);
                 ADDz(x4, ed, x4);
diff --git a/src/dynarec/rv64/dynarec_rv64_helper.c b/src/dynarec/rv64/dynarec_rv64_helper.c
index 1a7d0f97..54a49850 100644
--- a/src/dynarec/rv64/dynarec_rv64_helper.c
+++ b/src/dynarec/rv64/dynarec_rv64_helper.c
@@ -872,11 +872,12 @@ void call_n(dynarec_rv64_t* dyn, int ninst, void* fnc, int w)
     // SET_NODF();
 }
 
-void grab_segdata(dynarec_rv64_t* dyn, uintptr_t addr, int ninst, int reg, int segment)
+void grab_segdata(dynarec_rv64_t* dyn, uintptr_t addr, int ninst, int reg, int segment, int modreg)
 {
     (void)addr;
     int64_t j64;
     MAYUSE(j64);
+    if (modreg) return;
     MESSAGE(LOG_DUMP, "Get %s Offset\n", (segment == _FS) ? "FS" : "GS");
     int t1 = x1, t2 = x4;
     if (reg == t1) ++t1;
diff --git a/src/dynarec/rv64/dynarec_rv64_helper.h b/src/dynarec/rv64/dynarec_rv64_helper.h
index 5669406f..909a2054 100644
--- a/src/dynarec/rv64/dynarec_rv64_helper.h
+++ b/src/dynarec/rv64/dynarec_rv64_helper.h
@@ -1394,7 +1394,7 @@ void retn_to_epilog(dynarec_rv64_t* dyn, int ninst, rex_t rex, int n);
 void iret_to_epilog(dynarec_rv64_t* dyn, int ninst, int is64bits);
 void call_c(dynarec_rv64_t* dyn, int ninst, void* fnc, int reg, int ret, int saveflags, int savereg, int arg1, int arg2, int arg3, int arg4, int arg5, int arg6);
 void call_n(dynarec_rv64_t* dyn, int ninst, void* fnc, int w);
-void grab_segdata(dynarec_rv64_t* dyn, uintptr_t addr, int ninst, int reg, int segment);
+void grab_segdata(dynarec_rv64_t* dyn, uintptr_t addr, int ninst, int reg, int segment, int modreg);
 void emit_cmp8(dynarec_rv64_t* dyn, int ninst, int s1, int s2, int s3, int s4, int s5, int s6);
 void emit_cmp16(dynarec_rv64_t* dyn, int ninst, int s1, int s2, int s3, int s4, int s5, int s6);
 void emit_cmp32(dynarec_rv64_t* dyn, int ninst, rex_t rex, int s1, int s2, int s3, int s4, int s5, int s6);