diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2023-11-13 12:53:16 +0100 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2023-11-13 12:53:16 +0100 |
| commit | 9daf8d6493cf9d6d98f5dd625c7b1ff466f7c245 (patch) | |
| tree | 230b5b55ce8b86c408f1acb6e905043c1c6cd08e | |
| parent | e071406829e5301aab5f53c4a9084aca302bb976 (diff) | |
| parent | ff85b03e3f7b332555d43f42cee6bdd37aad9c65 (diff) | |
| download | box64-9daf8d6493cf9d6d98f5dd625c7b1ff466f7c245.tar.gz box64-9daf8d6493cf9d6d98f5dd625c7b1ff466f7c245.zip | |
Merge branch 'main' of https://github.com/ptitSeb/box64
| -rw-r--r-- | CMakeLists.txt | 1 | ||||
| -rw-r--r-- | src/dynarec/arm64/dynarec_arm64_67.c | 2 | ||||
| -rw-r--r-- | src/dynarec/rv64/dynarec_rv64_00_1.c | 5 | ||||
| -rw-r--r-- | src/dynarec/rv64/dynarec_rv64_64.c | 18 | ||||
| -rw-r--r-- | src/dynarec/rv64/dynarec_rv64_67.c | 25 | ||||
| -rw-r--r-- | src/dynarec/rv64/dynarec_rv64_67_32.c | 59 | ||||
| -rw-r--r-- | src/dynarec/rv64/dynarec_rv64_helper.h | 50 |
7 files changed, 133 insertions, 27 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt index 95cfbfef..ee13f627 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -711,6 +711,7 @@ if(RV64_DYNAREC) #"${BOX64_ROOT}/src/dynarec/rv64/dynarec_rv64_65.c" "${BOX64_ROOT}/src/dynarec/rv64/dynarec_rv64_66.c" "${BOX64_ROOT}/src/dynarec/rv64/dynarec_rv64_67.c" + "${BOX64_ROOT}/src/dynarec/rv64/dynarec_rv64_67_32.c" "${BOX64_ROOT}/src/dynarec/rv64/dynarec_rv64_d8.c" "${BOX64_ROOT}/src/dynarec/rv64/dynarec_rv64_d9.c" #"${BOX64_ROOT}/src/dynarec/rv64/dynarec_rv64_da.c" diff --git a/src/dynarec/arm64/dynarec_arm64_67.c b/src/dynarec/arm64/dynarec_arm64_67.c index 5cc96deb..fe88a71c 100644 --- a/src/dynarec/arm64/dynarec_arm64_67.c +++ b/src/dynarec/arm64/dynarec_arm64_67.c @@ -276,7 +276,7 @@ uintptr_t dynarec64_67(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin if(MODREG) { if(rex.rex) { eb1 = xRAX+(nextop&7)+(rex.b<<3); - eb2 = 0; \ + eb2 = 0; } else { ed = (nextop&7); eb1 = xRAX+(ed&3); // Ax, Cx, Dx or Bx diff --git a/src/dynarec/rv64/dynarec_rv64_00_1.c b/src/dynarec/rv64/dynarec_rv64_00_1.c index 54ca28f5..4cc3a66c 100644 --- a/src/dynarec/rv64/dynarec_rv64_00_1.c +++ b/src/dynarec/rv64/dynarec_rv64_00_1.c @@ -172,7 +172,10 @@ uintptr_t dynarec64_00_1(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int 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/rv64/dynarec_rv64_64.c b/src/dynarec/rv64/dynarec_rv64_64.c index bc3b2c96..40c6d861 100644 --- a/src/dynarec/rv64/dynarec_rv64_64.c +++ b/src/dynarec/rv64/dynarec_rv64_64.c @@ -393,7 +393,23 @@ uintptr_t dynarec64_64(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni LDxw(gd, x4, fixedaddress); } break; - + case 0x8E: + INST_NAME("MOV Seg,Ew"); + grab_segdata(dyn, addr, ninst, x4, seg); + nextop = F8; + u8 = (nextop&0x38) >> 3; + if ((nextop&0xC0) == 0xC0) { + ed = xRAX+(nextop&7) + (rex.b<<3); + } else { + SMREAD(); + addr = geted(dyn, addr, ninst, nextop, &wback, x2, x1, &fixedaddress, rex, NULL, 0, 0); + ADD(x4, wback, x4); + LHU(x1, x4, 0); + ed = x1; + } + SH(ed, xEmu, offsetof(x64emu_t, segs[u8])); + SW(xZR, xEmu, offsetof(x64emu_t, segs_serial[u8])); + break; case 0xA1: INST_NAME("MOV EAX,FS:Od"); grab_segdata(dyn, addr, ninst, x4, seg); diff --git a/src/dynarec/rv64/dynarec_rv64_67.c b/src/dynarec/rv64/dynarec_rv64_67.c index 5f102742..46fed446 100644 --- a/src/dynarec/rv64/dynarec_rv64_67.c +++ b/src/dynarec/rv64/dynarec_rv64_67.c @@ -180,6 +180,31 @@ uintptr_t dynarec64_67(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni DEFAULT; } break; + case 0xB6: + INST_NAME("MOVXZ Gd, Eb"); + nextop = F8; + GETGD; + if(MODREG) { + if (rex.rex) { + eb1 = xRAX + (nextop & 7) + (rex.b << 3); + eb2 = 0; + } else { + ed = (nextop & 7); + eb1 = xRAX + (ed & 3); // Ax, Cx, Dx or Bx + eb2 = (ed & 4) >> 2; // L or H + } + if (eb2) { + SRLI(gd, eb1, 8); + ANDI(gd, gd, 0xff); + } else { + ANDI(gd, eb1, 0xff); + } + } else { + SMREAD(); + addr = geted32(dyn, addr, ninst, nextop, &ed, x2, x1, &fixedaddress, rex, &lock, 1, 0); + LBU(gd, ed, fixedaddress); + } + break; default: DEFAULT; } diff --git a/src/dynarec/rv64/dynarec_rv64_67_32.c b/src/dynarec/rv64/dynarec_rv64_67_32.c new file mode 100644 index 00000000..aa663d34 --- /dev/null +++ b/src/dynarec/rv64/dynarec_rv64_67_32.c @@ -0,0 +1,59 @@ +#include <stdio.h> +#include <stdlib.h> +#include <stddef.h> +#include <errno.h> +#include <assert.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 "rv64_printer.h" +#include "dynarec_rv64_private.h" +#include "dynarec_rv64_helper.h" +#include "dynarec_rv64_functions.h" + +uintptr_t dynarec64_67_32(dynarec_rv64_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; + + 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) { + default: + DEFAULT; + } + return addr; +} diff --git a/src/dynarec/rv64/dynarec_rv64_helper.h b/src/dynarec/rv64/dynarec_rv64_helper.h index cc05f141..cf1b29bf 100644 --- a/src/dynarec/rv64/dynarec_rv64_helper.h +++ b/src/dynarec/rv64/dynarec_rv64_helper.h @@ -1008,32 +1008,33 @@ void* rv64_next(x64emu_t* emu, uintptr_t addr); #define native_pass STEPNAME(native_pass) -#define dynarec64_00 STEPNAME(dynarec64_00) -#define dynarec64_00_0 STEPNAME(dynarec64_00_0) -#define dynarec64_00_1 STEPNAME(dynarec64_00_1) -#define dynarec64_00_2 STEPNAME(dynarec64_00_2) -#define dynarec64_00_3 STEPNAME(dynarec64_00_3) -#define dynarec64_0F STEPNAME(dynarec64_0F) -#define dynarec64_64 STEPNAME(dynarec64_64) -#define dynarec64_65 STEPNAME(dynarec64_65) -#define dynarec64_66 STEPNAME(dynarec64_66) -#define dynarec64_67 STEPNAME(dynarec64_67) -#define dynarec64_D8 STEPNAME(dynarec64_D8) -#define dynarec64_D9 STEPNAME(dynarec64_D9) -#define dynarec64_DA STEPNAME(dynarec64_DA) -#define dynarec64_DB STEPNAME(dynarec64_DB) -#define dynarec64_DC STEPNAME(dynarec64_DC) -#define dynarec64_DD STEPNAME(dynarec64_DD) -#define dynarec64_DE STEPNAME(dynarec64_DE) -#define dynarec64_DF STEPNAME(dynarec64_DF) -#define dynarec64_F0 STEPNAME(dynarec64_F0) -#define dynarec64_660F STEPNAME(dynarec64_660F) +#define dynarec64_00 STEPNAME(dynarec64_00) +#define dynarec64_00_0 STEPNAME(dynarec64_00_0) +#define dynarec64_00_1 STEPNAME(dynarec64_00_1) +#define dynarec64_00_2 STEPNAME(dynarec64_00_2) +#define dynarec64_00_3 STEPNAME(dynarec64_00_3) +#define dynarec64_0F STEPNAME(dynarec64_0F) +#define dynarec64_64 STEPNAME(dynarec64_64) +#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_D8 STEPNAME(dynarec64_D8) +#define dynarec64_D9 STEPNAME(dynarec64_D9) +#define dynarec64_DA STEPNAME(dynarec64_DA) +#define dynarec64_DB STEPNAME(dynarec64_DB) +#define dynarec64_DC STEPNAME(dynarec64_DC) +#define dynarec64_DD STEPNAME(dynarec64_DD) +#define dynarec64_DE STEPNAME(dynarec64_DE) +#define dynarec64_DF STEPNAME(dynarec64_DF) +#define dynarec64_F0 STEPNAME(dynarec64_F0) +#define dynarec64_660F STEPNAME(dynarec64_660F) #define dynarec64_66F20F STEPNAME(dynarec64_66F20F) #define dynarec64_66F30F STEPNAME(dynarec64_66F30F) -#define dynarec64_6664 STEPNAME(dynarec64_6664) -#define dynarec64_66F0 STEPNAME(dynarec64_66F0) -#define dynarec64_F20F STEPNAME(dynarec64_F20F) -#define dynarec64_F30F STEPNAME(dynarec64_F30F) +#define dynarec64_6664 STEPNAME(dynarec64_6664) +#define dynarec64_66F0 STEPNAME(dynarec64_66F0) +#define dynarec64_F20F STEPNAME(dynarec64_F20F) +#define dynarec64_F30F STEPNAME(dynarec64_F30F) #define geted STEPNAME(geted) #define geted32 STEPNAME(geted32) @@ -1372,6 +1373,7 @@ uintptr_t dynarec64_64(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni // uintptr_t dynarec64_65(dynarec_rv64_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_rv64_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_rv64_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_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ninst, rex_t rex, int rep, int* ok, int* need_epilog); uintptr_t dynarec64_D8(dynarec_rv64_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_rv64_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_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ninst, rex_t rex, int rep, int* ok, int* need_epilog); |