about summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2023-05-05 21:39:32 +0200
committerptitSeb <sebastien.chev@gmail.com>2023-05-05 21:39:54 +0200
commitcf22cbcab5a04377132c4e6ab488f2ce3bdac857 (patch)
tree0973e971c58e015c2f01146ce762259080e31d77
parente444b277f853ff30231678016034c8c2cb52bd0b (diff)
downloadbox64-cf22cbcab5a04377132c4e6ab488f2ce3bdac857.tar.gz
box64-cf22cbcab5a04377132c4e6ab488f2ce3bdac857.zip
Added 65 8D opcode ([ARM64_DYNAREC] too) (for #766)
-rw-r--r--src/dynarec/arm64/dynarec_arm64_64.c17
-rw-r--r--src/emu/x64run64.c10
2 files changed, 27 insertions, 0 deletions
diff --git a/src/dynarec/arm64/dynarec_arm64_64.c b/src/dynarec/arm64/dynarec_arm64_64.c
index da2c8c4a..bb589b16 100644
--- a/src/dynarec/arm64/dynarec_arm64_64.c
+++ b/src/dynarec/arm64/dynarec_arm64_64.c
@@ -570,6 +570,23 @@ uintptr_t dynarec64_64(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
             }
             break;
 
+        case 0x8D:
+            INST_NAME("LEA Gd, Ed");
+            nextop=F8;
+            GETGD;
+            if(MODREG) {   // reg <= reg? that's an invalid operation
+                DEFAULT;
+            } else {                    // mem <= reg
+                addr = geted(dyn, addr, ninst, nextop, &ed, gd, &fixedaddress, NULL, 0, 0, rex, NULL, 0, 0);
+                if(gd!=ed) {    // it's sometimes used as a 3 bytes NOP
+                    MOVxw_REG(gd, ed);
+                }
+                else if(!rex.w) {
+                    MOVw_REG(gd, gd);   //truncate the higher 32bits as asked
+                }
+            }
+            break;
+
         case 0xC6:
             INST_NAME("MOV Seg:Eb, Ib");
             grab_segdata(dyn, addr, ninst, x4, seg);
diff --git a/src/emu/x64run64.c b/src/emu/x64run64.c
index 6a3e961d..a2d5cc74 100644
--- a/src/emu/x64run64.c
+++ b/src/emu/x64run64.c
@@ -401,6 +401,16 @@ uintptr_t Run64(x64emu_t *emu, rex_t rex, int seg, uintptr_t addr)
                 GD->q[0] = ED->dword[0];

             break;

 

+        case 0x8D:                      /* LEA Gd,M */

+            nextop = F8;

+            GETGD;

+            tmp64u = GETEA(0);

+            if(rex.w)

+                GD->q[0] = tmp64u;

+            else

+                GD->q[0] = tmp64u&0xffffffff;

+            break;

+

         case 0xA1:                      /* MOV EAX,FS:Od */

             tmp64u = F64;

             if(rex.w)