about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2024-01-06 10:58:02 +0100
committerptitSeb <sebastien.chev@gmail.com>2024-01-06 10:58:02 +0100
commit870b71afec345fbfa4de193b1fc3cca3d115621b (patch)
tree2323803d24eb884e0b96f56d0cd93a03f0c727ec /src
parent18e0af6b3844253d4c8214e458427e863df0204d (diff)
downloadbox64-870b71afec345fbfa4de193b1fc3cca3d115621b.tar.gz
box64-870b71afec345fbfa4de193b1fc3cca3d115621b.zip
[INTERPRETER] Added 67 66 8D opcode ([ARM64_DYNAREC] too)
Diffstat (limited to 'src')
-rw-r--r--src/dynarec/arm64/dynarec_arm64_67.c15
-rw-r--r--src/emu/modrm.h1
-rw-r--r--src/emu/x64run6766.c10
-rw-r--r--src/emu/x64run_private.c8
-rw-r--r--src/emu/x64run_private.h1
5 files changed, 35 insertions, 0 deletions
diff --git a/src/dynarec/arm64/dynarec_arm64_67.c b/src/dynarec/arm64/dynarec_arm64_67.c
index 7930fdaf..a79b1b19 100644
--- a/src/dynarec/arm64/dynarec_arm64_67.c
+++ b/src/dynarec/arm64/dynarec_arm64_67.c
@@ -670,6 +670,21 @@ uintptr_t dynarec64_67(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                     }

                     break;

 

+                case 0x8D:

+                    INST_NAME("LEA Gw, Ed");

+                    nextop=F8;

+                    //GETGW(x1);

+                    gd = x1;    // no need to read

+                    if(MODREG) {   // reg <= reg? that's an invalid operation

+                        DEFAULT;

+                    } else {                    // mem <= reg

+                        addr = geted32(dyn, addr, ninst, nextop, &ed, gd, &fixedaddress, NULL, 0, 0, rex, NULL, 0, 0);

+                        if(ed!=gd)

+                            gd = ed;

+                    }

+                    GWBACK;

+                    break;

+

                 default:

                     DEFAULT;

             }

diff --git a/src/emu/modrm.h b/src/emu/modrm.h
index cd967c0e..3d29747f 100644
--- a/src/emu/modrm.h
+++ b/src/emu/modrm.h
@@ -82,6 +82,7 @@
 #define FAKEED(D)           GetEd(emu, &addr, rex, nextop, D)

 #define FAKEED32(D)         GetEd32O(emu, &addr, rex, nextop, D, 0)

 #define GETEA(D)            GetEA(emu, &addr, rex, nextop, D)

+#define GETEA32(D)          GetEA32(emu, &addr, rex, nextop, D)

 #define _GETED(D)           oped=GetEd(emu, &addr, rex, nextop, D)

 #define _GETED32(D)         oped=GetEd32O(emu, &addr, rex, nextop, D, 0)

 

diff --git a/src/emu/x64run6766.c b/src/emu/x64run6766.c
index 35219b2c..33c2daf8 100644
--- a/src/emu/x64run6766.c
+++ b/src/emu/x64run6766.c
@@ -82,6 +82,16 @@ uintptr_t Run6766(x64emu_t *emu, rex_t rex, int rep, uintptr_t addr)
             EW->word[0] = GW->word[0];
         break;
 
+    case 0x8D:                              /* LEA Gw,M */
+        nextop = F8;
+        GETGW;
+        tmp64u = GETEA32(0);
+        if(rex.w)
+            GW->q[0] = tmp64u;
+        else
+            GW->word[0] = (uint16_t)tmp64u;
+        break;
+
     default:
         return 0;
     }
diff --git a/src/emu/x64run_private.c b/src/emu/x64run_private.c
index 9015d0e1..739f9e09 100644
--- a/src/emu/x64run_private.c
+++ b/src/emu/x64run_private.c
@@ -1679,6 +1679,14 @@ uintptr_t GetEA(x64emu_t *emu, uintptr_t* addr, rex_t rex, uint8_t v, uint8_t de
     } else return (uintptr_t)GetECommon(emu, addr, rex, m, delta);
 }
 
+uintptr_t GetEA32(x64emu_t *emu, uintptr_t* addr, rex_t rex, uint8_t v, uint8_t delta)
+{
+    uint8_t m = v&0xC7;    // filter Ed
+    if(m>=0xC0) {
+         return (uintptr_t)&emu->regs[(m&0x07)+(rex.b<<3)];
+    } else return (uintptr_t)GetECommon32O(emu, addr, rex, m, delta, 0);
+}
+
 reg64_t* GetEdO(x64emu_t *emu, uintptr_t* addr, rex_t rex, uint8_t v, uint8_t delta, uintptr_t offset)
 {
     uint8_t m = v&0xC7;    // filter Ed
diff --git a/src/emu/x64run_private.h b/src/emu/x64run_private.h
index f90a35e3..f6b5b176 100644
--- a/src/emu/x64run_private.h
+++ b/src/emu/x64run_private.h
@@ -90,6 +90,7 @@ reg64_t* TestEd8(x64test_t *test, uintptr_t* addr, rex_t rex, uint8_t v, uint8_t
 reg64_t* TestEd8xw(x64test_t *test, int w, uintptr_t* addr, rex_t rex, uint8_t v, uint8_t delta);
 reg64_t* TestEdt(x64test_t *test, uintptr_t* addr, rex_t rex, uint8_t v, uint8_t delta);
 uintptr_t GetEA(x64emu_t *emu, uintptr_t* addr, rex_t rex, uint8_t v, uint8_t delta);
+uintptr_t GetEA32(x64emu_t *emu, uintptr_t* addr, rex_t rex, uint8_t v, uint8_t delta);
 reg64_t* GetEdO(x64emu_t *emu, uintptr_t* addr, rex_t rex, uint8_t v, uint8_t delta, uintptr_t offset);
 reg64_t* TestEdO(x64test_t *test, uintptr_t* addr, rex_t rex, uint8_t v, uint8_t delta, uintptr_t offset);
 reg64_t* GetEd32O(x64emu_t *emu, uintptr_t* addr, rex_t rex, uint8_t v, uint8_t delta, uintptr_t offset);