diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2023-10-23 16:44:13 +0200 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2023-10-23 16:44:13 +0200 |
| commit | 671328aaf6a86500bfad3766cd5935bdc613954d (patch) | |
| tree | a828d9b66316f2f4b8f1d89f42b0f417080d4cbe /src | |
| parent | c7bd174d7cc0424dc2cb8728d4ead006a78fe2c9 (diff) | |
| download | box64-671328aaf6a86500bfad3766cd5935bdc613954d.tar.gz box64-671328aaf6a86500bfad3766cd5935bdc613954d.zip | |
[ARM64_DYNAREC][32BITS] Added 67 64 FF /6 opcode
Diffstat (limited to 'src')
| -rw-r--r-- | src/dynarec/arm64/dynarec_arm64_00.c | 5 | ||||
| -rw-r--r-- | src/dynarec/arm64/dynarec_arm64_64.c | 7 | ||||
| -rw-r--r-- | src/dynarec/arm64/dynarec_arm64_6764_32.c | 89 | ||||
| -rw-r--r-- | src/dynarec/arm64/dynarec_arm64_67_32.c | 72 | ||||
| -rw-r--r-- | src/dynarec/arm64/dynarec_arm64_helper.h | 4 |
5 files changed, 176 insertions, 1 deletions
diff --git a/src/dynarec/arm64/dynarec_arm64_00.c b/src/dynarec/arm64/dynarec_arm64_00.c index 6b2936e2..d078029b 100644 --- a/src/dynarec/arm64/dynarec_arm64_00.c +++ b/src/dynarec/arm64/dynarec_arm64_00.c @@ -726,7 +726,10 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin addr = dynarec64_66(dyn, addr, ip, ninst, rex, rep, ok, need_epilog); break; case 0x67: - addr = dynarec64_67(dyn, addr, ip, ninst, rex, rep, ok, need_epilog); + if(rex.is32bits) + addr = dynarec64_67_32(dyn, addr, ip, ninst, rex, rep, ok, need_epilog); + else + addr = dynarec64_67(dyn, addr, ip, ninst, rex, rep, ok, need_epilog); break; case 0x68: INST_NAME("PUSH Id"); diff --git a/src/dynarec/arm64/dynarec_arm64_64.c b/src/dynarec/arm64/dynarec_arm64_64.c index ed80d97b..fbd9ca8a 100644 --- a/src/dynarec/arm64/dynarec_arm64_64.c +++ b/src/dynarec/arm64/dynarec_arm64_64.c @@ -384,6 +384,13 @@ uintptr_t dynarec64_64(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin case 0x66: addr = dynarec64_6664(dyn, addr, ip, ninst, rex, seg, ok, need_epilog); break; + case 0x67: + if(rex.is32bits) + addr = dynarec64_6764_32(dyn, addr, ip, ninst, rex, rep, seg, ok, need_epilog); + else { + DEFAULT; + } + break; case 0x80: nextop = F8; diff --git a/src/dynarec/arm64/dynarec_arm64_6764_32.c b/src/dynarec/arm64/dynarec_arm64_6764_32.c new file mode 100644 index 00000000..ee8b0036 --- /dev/null +++ b/src/dynarec/arm64/dynarec_arm64_6764_32.c @@ -0,0 +1,89 @@ +#include <stdio.h> +#include <stdlib.h> +#include <stddef.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_native.h" + +#include "arm64_printer.h" +#include "dynarec_arm64_private.h" +#include "dynarec_arm64_helper.h" +#include "dynarec_arm64_functions.h" + +#define GETGm gd = ((nextop&0x38)>>3) + +uintptr_t dynarec64_6764_32(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int ninst, rex_t rex, int rep, int seg, int* ok, int* need_epilog) +{ + (void)ip; (void)need_epilog; + + uint8_t opcode = F8; + uint8_t nextop; + uint8_t gd, ed, wback, wb, wb1, wb2, gb1, gb2, eb1, eb2; + int64_t fixedaddress; + int unscaled; + int8_t i8; + uint8_t u8; + int32_t i32; + int64_t j64, i64; + int cacheupd = 0; + int lock; + int v0, v1, s0; + MAYUSE(i32); + MAYUSE(j64); + MAYUSE(v0); + MAYUSE(v1); + MAYUSE(s0); + MAYUSE(lock); + MAYUSE(cacheupd); + + if(!rex.is32bits) { + // should do a different file + DEFAULT; + return addr; + } + + rep = 0; + while((opcode==0xF2) || (opcode==0xF3)) { + rep = opcode-0xF1; + opcode = F8; + } + + switch(opcode) { + + case 0xFF: + nextop = F8; + grab_segdata(dyn, addr, ninst, x4, seg); + switch((nextop>>3)&7) { + case 6: // Push Ed + INST_NAME("PUSH FS:Ew"); + if((nextop&0xC0)==0xC0) { // reg + DEFAULT; + } else { // mem <= i32 + SMREAD(); + addr = geted16(dyn, addr, ninst, nextop, &ed, x2, &fixedaddress, &unscaled, 0, 0, 0); + LDRw_REG(x3, ed, x4); + PUSH1_32(x3); + } + break; + default: + DEFAULT; + } + break; + + + default: + DEFAULT; + } + return addr; +} diff --git a/src/dynarec/arm64/dynarec_arm64_67_32.c b/src/dynarec/arm64/dynarec_arm64_67_32.c new file mode 100644 index 00000000..c4315996 --- /dev/null +++ b/src/dynarec/arm64/dynarec_arm64_67_32.c @@ -0,0 +1,72 @@ +#include <stdio.h> +#include <stdlib.h> +#include <stddef.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_native.h" + +#include "arm64_printer.h" +#include "dynarec_arm64_private.h" +#include "dynarec_arm64_helper.h" +#include "dynarec_arm64_functions.h" + +#define GETGm gd = ((nextop&0x38)>>3) + +uintptr_t dynarec64_67_32(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int ninst, rex_t rex, int rep, int* ok, int* need_epilog) +{ + (void)ip; (void)need_epilog; + + uint8_t opcode = F8; + uint8_t nextop; + uint8_t gd, ed, wback, wb, wb1, wb2, gb1, gb2, eb1, eb2; + int64_t fixedaddress; + int unscaled; + int8_t i8; + uint8_t u8; + int32_t i32; + int64_t j64, i64; + int cacheupd = 0; + int lock; + int v0, v1, s0; + MAYUSE(i32); + MAYUSE(j64); + MAYUSE(v0); + MAYUSE(v1); + MAYUSE(s0); + MAYUSE(lock); + MAYUSE(cacheupd); + + if(!rex.is32bits) { + // should do a different file + DEFAULT; + return addr; + } + + rep = 0; + while((opcode==0xF2) || (opcode==0xF3)) { + rep = opcode-0xF1; + opcode = F8; + } + + switch(opcode) { + + case 64: + addr = dynarec64_6764_32(dyn, addr, ip, ninst, rex, rep, _FS, ok, need_epilog); + break; + + default: + DEFAULT; + } + return addr; +} diff --git a/src/dynarec/arm64/dynarec_arm64_helper.h b/src/dynarec/arm64/dynarec_arm64_helper.h index be4c5814..c794a161 100644 --- a/src/dynarec/arm64/dynarec_arm64_helper.h +++ b/src/dynarec/arm64/dynarec_arm64_helper.h @@ -918,6 +918,8 @@ void* arm64_next(x64emu_t* emu, uintptr_t addr); #define dynarec64_65 STEPNAME(dynarec64_65) #define dynarec64_66 STEPNAME(dynarec64_66) #define dynarec64_67 STEPNAME(dynarec64_67) +#define dynarec64_67_32 STEPNAME(dynarec64_67_32) +#define dynarec64_6764_32 STEPNAME(dynarec64_6764_32) #define dynarec64_D8 STEPNAME(dynarec64_D8) #define dynarec64_D9 STEPNAME(dynarec64_D9) #define dynarec64_DA STEPNAME(dynarec64_DA) @@ -1252,6 +1254,8 @@ uintptr_t dynarec64_64(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin //uintptr_t dynarec64_65(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_66(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_67(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_67_32(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_6764_32(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int ninst, rex_t rex, int rep, int seg, int* ok, int* need_epilog); uintptr_t dynarec64_D8(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_D9(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_DA(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int ninst, rex_t rex, int rep, int* ok, int* need_epilog); |