diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2024-01-06 10:58:02 +0100 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2024-01-06 10:58:02 +0100 |
| commit | 870b71afec345fbfa4de193b1fc3cca3d115621b (patch) | |
| tree | 2323803d24eb884e0b96f56d0cd93a03f0c727ec /src | |
| parent | 18e0af6b3844253d4c8214e458427e863df0204d (diff) | |
| download | box64-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.c | 15 | ||||
| -rw-r--r-- | src/emu/modrm.h | 1 | ||||
| -rw-r--r-- | src/emu/x64run6766.c | 10 | ||||
| -rw-r--r-- | src/emu/x64run_private.c | 8 | ||||
| -rw-r--r-- | src/emu/x64run_private.h | 1 |
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); |