diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2021-04-04 14:55:58 +0200 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2021-04-04 14:55:58 +0200 |
| commit | c172fbd8835de65f717119b24908cf3ad9e01424 (patch) | |
| tree | 4ae8d4c9d35c813c5a1955bef486cdd3484a2b9d /src | |
| parent | 5fb581a51fa8dbd38caf81b999cca52d0707a143 (diff) | |
| download | box64-c172fbd8835de65f717119b24908cf3ad9e01424.tar.gz box64-c172fbd8835de65f717119b24908cf3ad9e01424.zip | |
[DYNAREC] Added 66 64 8B opcode
Diffstat (limited to 'src')
| -rwxr-xr-x | src/dynarec/dynarec_arm64_66.c | 6 | ||||
| -rw-r--r-- | src/dynarec/dynarec_arm64_6664.c | 79 | ||||
| -rwxr-xr-x | src/dynarec/dynarec_arm64_helper.h | 2 |
3 files changed, 86 insertions, 1 deletions
diff --git a/src/dynarec/dynarec_arm64_66.c b/src/dynarec/dynarec_arm64_66.c index 631579c1..8538ef59 100755 --- a/src/dynarec/dynarec_arm64_66.c +++ b/src/dynarec/dynarec_arm64_66.c @@ -52,7 +52,7 @@ uintptr_t dynarec64_66(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin } if(rex.w && opcode!=0x0f) // rex.w cancels "66", but not for 66 0f type of prefix - return dynarec64_00(dyn, addr-1, ip, ninst, rex, rep, ok, need_epilog); + return dynarec64_00(dyn, addr-2, ip, ninst, rex, rep, ok, need_epilog); switch(opcode) { case 0x01: @@ -289,6 +289,10 @@ uintptr_t dynarec64_66(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin } break; + case 0x64: + addr = dynarec64_6664(dyn, addr, ip, ninst, rex, rep, ok, need_epilog); + break; + case 0x66: addr = dynarec64_66(dyn, addr, ip, ninst, rex, rep, ok, need_epilog); break; diff --git a/src/dynarec/dynarec_arm64_6664.c b/src/dynarec/dynarec_arm64_6664.c new file mode 100644 index 00000000..a17a3a85 --- /dev/null +++ b/src/dynarec/dynarec_arm64_6664.c @@ -0,0 +1,79 @@ +#include <stdio.h> +#include <stdlib.h> +#include <stddef.h> +#include <pthread.h> +#include <errno.h> + +#include "debug.h" +#include "box64context.h" +#include "dynarec.h" +#include "emu/x64emu_private.h" +#include "emu/x64run_private.h" +#include "x64run.h" +#include "x64emu.h" +#include "box64stack.h" +#include "callback.h" +#include "emu/x64run_private.h" +#include "x64trace.h" +#include "dynarec_arm64.h" +#include "dynarec_arm64_private.h" +#include "arm64_printer.h" + +#include "dynarec_arm64_helper.h" +#include "dynarec_arm64_functions.h" + + +uintptr_t dynarec64_6664(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int ninst, rex_t rex, int rep, int* ok, int* need_epilog) +{ + uint8_t opcode = F8; + uint8_t nextop; + uint8_t gd, ed; + int fixedaddress; + + // REX prefix before the 66 are ignored + rex.rex = 0; + while(opcode>=0x40 && opcode<=0x4f) { + rex.rex = opcode; + opcode = F8; + } + + /*if(rex.w && opcode!=0x0f) { // rex.w cancels "66", but not for 66 0f type of prefix + MESSAGE(LOG_DUMP, "Here!\n"); + return dynarec64_64(dyn, addr-2, ip, ninst, rex, rep, ok, need_epilog); + }*/ + + switch(opcode) { + + + case 0x8B: + INST_NAME("MOV Gd, FS:Ed"); + grab_segdata(dyn, addr, ninst, x4, _FS); + nextop=F8; + GETGD; + if(MODREG) { // reg <= reg + ed = xRAX+(nextop&7)+(rex.b<<3); + if(rex.w) { + MOVx_REG(gd, ed); + } else { + if(ed!=gd) { + BFIx(gd, ed, 0, 16); + } + } + } else { // mem <= reg + addr = geted(dyn, addr, ninst, nextop, &ed, x2, &fixedaddress, 0, 0, rex, 0, 0); + if(rex.w) { + LDRx_REG(gd, ed, x4); + } else { + LDRH_REG(x1, ed, x4); + BFIx(gd, x1, 0, 16); + } + } + break; + + + default: + DEFAULT; + } + return addr; +} + diff --git a/src/dynarec/dynarec_arm64_helper.h b/src/dynarec/dynarec_arm64_helper.h index 61a115c5..73a7948c 100755 --- a/src/dynarec/dynarec_arm64_helper.h +++ b/src/dynarec/dynarec_arm64_helper.h @@ -578,6 +578,7 @@ void* arm64_next(x64emu_t* emu, uintptr_t addr); #define dynarec64_DF STEPNAME(dynarec64_DF) #define dynarec64_F0 STEPNAME(dynarec64_F0) #define dynarec64_660F STEPNAME(dynarec64_660F) +#define dynarec64_6664 STEPNAME(dynarec64_6664) #define dynarec64_F20F STEPNAME(dynarec64_F20F) #define dynarec64_F30F STEPNAME(dynarec64_F30F) @@ -852,6 +853,7 @@ uintptr_t dynarec64_DD(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin uintptr_t dynarec64_DF(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int ninst, rex_t rex, int rep, int* ok, int* need_epilog); uintptr_t dynarec64_F0(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int ninst, rex_t rex, int rep, int* ok, int* need_epilog); uintptr_t dynarec64_660F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int ninst, rex_t rex, int rep, int* ok, int* need_epilog); +uintptr_t dynarec64_6664(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int ninst, rex_t rex, int rep, int* ok, int* need_epilog); uintptr_t dynarec64_F20F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int ninst, rex_t rex, int* ok, int* need_epilog); uintptr_t dynarec64_F30F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int ninst, rex_t rex, int* ok, int* need_epilog); |