diff options
| author | Yang Liu <liuyang22@iscas.ac.cn> | 2025-06-12 15:36:03 +0800 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-06-12 09:36:03 +0200 |
| commit | e0ef3284022679da09c4e1163ad8d12647a2a367 (patch) | |
| tree | f79c64c46b17f48646b21f225ce6616711d5f679 /src | |
| parent | e0067667f73bcf65bc0bc8636f8e2f5bbc32ea6d (diff) | |
| download | box64-e0ef3284022679da09c4e1163ad8d12647a2a367.tar.gz box64-e0ef3284022679da09c4e1163ad8d12647a2a367.zip | |
[ARM64_DYNAREC] Added 64/65 67 89/8B 64bits opcodes (#2730)
* [ARM64_DYNAREC] Added 64/65 67 89/8B 64bits opcodes * review
Diffstat (limited to 'src')
| -rw-r--r-- | src/dynarec/arm64/dynarec_arm64_64.c | 2 | ||||
| -rw-r--r-- | src/dynarec/arm64/dynarec_arm64_6764.c | 94 | ||||
| -rw-r--r-- | src/dynarec/arm64/dynarec_arm64_helper.h | 2 |
3 files changed, 97 insertions, 1 deletions
diff --git a/src/dynarec/arm64/dynarec_arm64_64.c b/src/dynarec/arm64/dynarec_arm64_64.c index 6c2cd592..1bb12d62 100644 --- a/src/dynarec/arm64/dynarec_arm64_64.c +++ b/src/dynarec/arm64/dynarec_arm64_64.c @@ -562,7 +562,7 @@ uintptr_t dynarec64_64(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin if(rex.is32bits) addr = dynarec64_6764_32(dyn, addr, ip, ninst, rex, rep, seg, ok, need_epilog); else { - DEFAULT; + addr = dynarec64_6764(dyn, addr, ip, ninst, rex, rep, seg, ok, need_epilog); } break; diff --git a/src/dynarec/arm64/dynarec_arm64_6764.c b/src/dynarec/arm64/dynarec_arm64_6764.c new file mode 100644 index 00000000..9d9bf405 --- /dev/null +++ b/src/dynarec/arm64/dynarec_arm64_6764.c @@ -0,0 +1,94 @@ +#include <stdio.h> +#include <stdlib.h> +#include <stddef.h> +#include <errno.h> + +#include "debug.h" +#include "box64context.h" +#include "box64cpu.h" +#include "emu/x64emu_private.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_helper.h" +#include "dynarec_arm64_functions.h" + +#define GETGm gd = ((nextop & 0x38) >> 3) + +uintptr_t dynarec64_6764(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); + + rep = 0; + while ((opcode == 0xF2) || (opcode == 0xF3)) { + rep = opcode - 0xF1; + opcode = F8; + } + + rex.rex = 0; + while (opcode >= 0x40 && opcode <= 0x4f) { + rex.rex = opcode; + opcode = F8; + } + + + switch (opcode) { + + case 0x89: + INST_NAME("MOV Seg:Ed, Gd"); + nextop = F8; + GETGD; + if (MODREG) { // reg <= reg + MOVxw_REG(TO_NAT((nextop & 7) + (rex.b << 3)), gd); + } else { // mem <= reg + grab_segdata(dyn, addr, ninst, x4, seg, (MODREG)); + addr = geted(dyn, addr, ninst, nextop, &ed, x2, &fixedaddress, NULL, 0, 0, rex, NULL, 0, 0); + STRxw_REG(gd, x4, ed); + } + break; + + case 0x8B: + INST_NAME("MOV Gd, Seg:Ed"); + nextop = F8; + GETGD; + if (MODREG) { // reg => reg + MOVxw_REG(gd, TO_NAT((nextop & 7) + (rex.b << 3))); + } else { // mem => reg + grab_segdata(dyn, addr, ninst, x4, seg, (MODREG)); + addr = geted(dyn, addr, ninst, nextop, &ed, x2, &fixedaddress, NULL, 0, 0, rex, NULL, 0, 0); + LDRxw_REG(gd, x4, ed); + } + break; + + default: + DEFAULT; + } + return addr; +} diff --git a/src/dynarec/arm64/dynarec_arm64_helper.h b/src/dynarec/arm64/dynarec_arm64_helper.h index f36601e6..b57d218b 100644 --- a/src/dynarec/arm64/dynarec_arm64_helper.h +++ b/src/dynarec/arm64/dynarec_arm64_helper.h @@ -1274,6 +1274,7 @@ void* arm64_next(x64emu_t* emu, uintptr_t addr); #define dynarec64_67 STEPNAME(dynarec64_67) #define dynarec64_67_32 STEPNAME(dynarec64_67_32) #define dynarec64_67_AVX STEPNAME(dynarec64_67_AVX) +#define dynarec64_6764 STEPNAME(dynarec64_6764) #define dynarec64_6764_32 STEPNAME(dynarec64_6764_32) #define dynarec64_D8 STEPNAME(dynarec64_D8) #define dynarec64_D9 STEPNAME(dynarec64_D9) @@ -1722,6 +1723,7 @@ uintptr_t dynarec64_66(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin 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_67_AVX(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int ninst, vex_t vex, int* ok, int* need_epilog); +uintptr_t dynarec64_6764(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_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); |