diff options
| author | Yang Liu <liuyang22@iscas.ac.cn> | 2024-10-10 18:15:48 +0800 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-10-10 12:15:48 +0200 |
| commit | 887dee83eb0dc9354be42436383a3d791943da2d (patch) | |
| tree | c43c874575aba0a11418848d417b0f54e8096052 | |
| parent | fd73a2bc8bc830054a4fcc418c630f4ad648be21 (diff) | |
| download | box64-887dee83eb0dc9354be42436383a3d791943da2d.tar.gz box64-887dee83eb0dc9354be42436383a3d791943da2d.zip | |
[RV64_DYNAREC] Added more boilerplate for vector (#1916)
| -rw-r--r-- | CMakeLists.txt | 4 | ||||
| -rw-r--r-- | src/dynarec/rv64/dynarec_rv64_00_0.c | 8 | ||||
| -rw-r--r-- | src/dynarec/rv64/dynarec_rv64_00_1.c | 16 | ||||
| -rw-r--r-- | src/dynarec/rv64/dynarec_rv64_64_vector.c | 82 | ||||
| -rw-r--r-- | src/dynarec/rv64/dynarec_rv64_67_vector.c | 116 | ||||
| -rw-r--r-- | src/dynarec/rv64/dynarec_rv64_f20f_vector.c | 54 | ||||
| -rw-r--r-- | src/dynarec/rv64/dynarec_rv64_f30f_vector.c | 62 | ||||
| -rw-r--r-- | src/dynarec/rv64/dynarec_rv64_helper.h | 8 |
8 files changed, 344 insertions, 6 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt index 612d4b8c..f87f21af 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -940,8 +940,10 @@ if(RV64_DYNAREC) "${BOX64_ROOT}/src/dynarec/rv64/dynarec_rv64_0f.c" "${BOX64_ROOT}/src/dynarec/rv64/dynarec_rv64_0f_vector.c" "${BOX64_ROOT}/src/dynarec/rv64/dynarec_rv64_64.c" + "${BOX64_ROOT}/src/dynarec/rv64/dynarec_rv64_64_vector.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_vector.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" @@ -959,7 +961,9 @@ if(RV64_DYNAREC) "${BOX64_ROOT}/src/dynarec/rv64/dynarec_rv64_6664.c" "${BOX64_ROOT}/src/dynarec/rv64/dynarec_rv64_66f0.c" "${BOX64_ROOT}/src/dynarec/rv64/dynarec_rv64_f20f.c" + "${BOX64_ROOT}/src/dynarec/rv64/dynarec_rv64_f20f_vector.c" "${BOX64_ROOT}/src/dynarec/rv64/dynarec_rv64_f30f.c" + "${BOX64_ROOT}/src/dynarec/rv64/dynarec_rv64_f30f_vector.c" ) endif() diff --git a/src/dynarec/rv64/dynarec_rv64_00_0.c b/src/dynarec/rv64/dynarec_rv64_00_0.c index 4bb35312..dcde6545 100644 --- a/src/dynarec/rv64/dynarec_rv64_00_0.c +++ b/src/dynarec/rv64/dynarec_rv64_00_0.c @@ -183,10 +183,14 @@ uintptr_t dynarec64_00_0(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int addr = retaddr ? retaddr : dynarec64_0F(dyn, addr, ip, ninst, rex, ok, need_epilog); break; case 1: - addr = dynarec64_F20F(dyn, addr, ip, ninst, rex, ok, need_epilog); + if (rv64_vector) + retaddr = dynarec64_F20F_vector(dyn, addr, ip, ninst, rex, ok, need_epilog); + addr = retaddr ? retaddr : dynarec64_F20F(dyn, addr, ip, ninst, rex, ok, need_epilog); break; case 2: - addr = dynarec64_F30F(dyn, addr, ip, ninst, rex, ok, need_epilog); + if (rv64_vector) + retaddr = dynarec64_F30F_vector(dyn, addr, ip, ninst, rex, ok, need_epilog); + addr = retaddr ? retaddr : dynarec64_F30F(dyn, addr, ip, ninst, rex, ok, need_epilog); break; default: DEFAULT; diff --git a/src/dynarec/rv64/dynarec_rv64_00_1.c b/src/dynarec/rv64/dynarec_rv64_00_1.c index f4195800..a9c97584 100644 --- a/src/dynarec/rv64/dynarec_rv64_00_1.c +++ b/src/dynarec/rv64/dynarec_rv64_00_1.c @@ -42,6 +42,7 @@ uintptr_t dynarec64_00_1(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int int64_t fixedaddress; int lock; int cacheupd = 0; + uintptr_t retaddr = 0; opcode = F8; MAYUSE(eb1); @@ -172,10 +173,14 @@ uintptr_t dynarec64_00_1(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int } break; case 0x64: - addr = dynarec64_64(dyn, addr, ip, ninst, rex, rep, _FS, ok, need_epilog); + if (rv64_vector) + retaddr = dynarec64_64_vector(dyn, addr, ip, ninst, rex, rep, _FS, ok, need_epilog); + addr = retaddr ? retaddr : dynarec64_64(dyn, addr, ip, ninst, rex, rep, _FS, ok, need_epilog); break; case 0x65: - addr = dynarec64_64(dyn, addr, ip, ninst, rex, rep, _GS, ok, need_epilog); + if (rv64_vector) + retaddr = dynarec64_64_vector(dyn, addr, ip, ninst, rex, rep, _GS, ok, need_epilog); + addr = retaddr ? retaddr : dynarec64_64(dyn, addr, ip, ninst, rex, rep, _GS, ok, need_epilog); break; case 0x66: addr = dynarec64_66(dyn, addr, ip, ninst, rex, rep, ok, need_epilog); @@ -183,8 +188,11 @@ uintptr_t dynarec64_00_1(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int case 0x67: 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); + else { + if (rv64_vector) + retaddr = dynarec64_67_vector(dyn, addr, ip, ninst, rex, rep, ok, need_epilog); + addr = retaddr ? retaddr : 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_vector.c b/src/dynarec/rv64/dynarec_rv64_64_vector.c new file mode 100644 index 00000000..52cb6764 --- /dev/null +++ b/src/dynarec/rv64/dynarec_rv64_64_vector.c @@ -0,0 +1,82 @@ +#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 "custommem.h" + +#include "rv64_printer.h" +#include "dynarec_rv64_private.h" +#include "dynarec_rv64_helper.h" +#include "dynarec_rv64_functions.h" + +uintptr_t dynarec64_64_vector(dynarec_rv64_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)rep; + (void)need_epilog; + + uint8_t opcode = F8; + uint8_t nextop; + uint8_t u8; + uint8_t gd, ed, eb1, eb2, gb1, gb2; + uint8_t gback, wback, wb1, wb2, wb; + int64_t i64, j64; + uint64_t u64; + int v0, v1; + int q0; + int d0; + int64_t fixedaddress, gdoffset; + int unscaled; + MAYUSE(eb1); + MAYUSE(eb2); + MAYUSE(wb1); + MAYUSE(wb2); + MAYUSE(gb1); + MAYUSE(gb2); + MAYUSE(j64); + MAYUSE(d0); + MAYUSE(q0); + MAYUSE(v0); + MAYUSE(v1); + + while ((opcode == 0xF2) || (opcode == 0xF3)) { + rep = opcode - 0xF1; + opcode = F8; + } + + GETREX(); + + switch (opcode) { + case 0x0F: + opcode = F8; + switch (opcode) { + case 0x10: + DEFAULT_VECTOR; + case 0x11: + DEFAULT_VECTOR; + case 0x28: + DEFAULT_VECTOR; + case 0x29: + DEFAULT_VECTOR; + case 0x6F: + DEFAULT_VECTOR; + } + break; + default: + return 0; + } + return addr; +} diff --git a/src/dynarec/rv64/dynarec_rv64_67_vector.c b/src/dynarec/rv64/dynarec_rv64_67_vector.c new file mode 100644 index 00000000..d82df0c9 --- /dev/null +++ b/src/dynarec/rv64/dynarec_rv64_67_vector.c @@ -0,0 +1,116 @@ +#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_vector(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, gb, 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; + } + + GETREX(); + + rep = 0; + while ((opcode == 0xF2) || (opcode == 0xF3)) { + rep = opcode - 0xF1; + opcode = F8; + } + + switch (opcode) { + case 0x0F: + opcode = F8; + switch (opcode) { + case 0x11: + DEFAULT_VECTOR; + case 0x2E: + case 0x2F: + DEFAULT_VECTOR; + case 0x6F: + switch (rep) { + case 2: + DEFAULT_VECTOR; + default: return 0; + } + break; + case 0x7F: + switch (rep) { + case 2: + DEFAULT_VECTOR; + default: return 0; + } + break; + default: + return 0; + } + break; + case 0x66: + opcode = F8; + GETREX(); + switch (opcode) { + case 0x0F: + nextop = F8; + switch (nextop) { + case 0x7E: + DEFAULT_VECTOR; + case 0xD6: + DEFAULT_VECTOR; + case 0xFE: + DEFAULT_VECTOR; + default: + return 0; + } + break; + default: + return 0; + } + break; + default: + return 0; + } + return addr; +} diff --git a/src/dynarec/rv64/dynarec_rv64_f20f_vector.c b/src/dynarec/rv64/dynarec_rv64_f20f_vector.c new file mode 100644 index 00000000..47747125 --- /dev/null +++ b/src/dynarec/rv64/dynarec_rv64_f20f_vector.c @@ -0,0 +1,54 @@ +#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 "rv64_printer.h" +#include "dynarec_rv64_private.h" +#include "dynarec_rv64_functions.h" +#include "dynarec_rv64_helper.h" + +uintptr_t dynarec64_F20F_vector(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ninst, rex_t rex, int* ok, int* need_epilog) +{ + (void)ip; + (void)need_epilog; + + uint8_t opcode = F8; + uint8_t nextop; + uint8_t gd, ed; + uint8_t wb1, wback, wb2, gback; + uint8_t u8; + uint64_t u64, j64; + int v0, v1; + int q0; + int d0, d1; + int s0, s1; + int64_t fixedaddress, gdoffset; + int unscaled; + + MAYUSE(d0); + MAYUSE(d1); + MAYUSE(q0); + MAYUSE(v0); + MAYUSE(v1); + + switch (opcode) { + case 0x38: + return 0; + default: DEFAULT_VECTOR; + } + return addr; +} diff --git a/src/dynarec/rv64/dynarec_rv64_f30f_vector.c b/src/dynarec/rv64/dynarec_rv64_f30f_vector.c new file mode 100644 index 00000000..09f9821e --- /dev/null +++ b/src/dynarec/rv64/dynarec_rv64_f30f_vector.c @@ -0,0 +1,62 @@ +#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 "bitutils.h" + +#include "rv64_printer.h" +#include "dynarec_rv64_private.h" +#include "dynarec_rv64_functions.h" +#include "dynarec_rv64_helper.h" + +uintptr_t dynarec64_F30F_vector(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ninst, rex_t rex, int* ok, int* need_epilog) +{ + (void)ip; + (void)need_epilog; + + uint8_t opcode = F8; + uint8_t nextop, u8; + uint8_t gd, ed; + uint8_t wback, gback; + uint64_t u64; + int v0, v1; + int q0, q1; + int d0, d1; + int64_t fixedaddress, gdoffset; + int unscaled; + int64_t j64; + + MAYUSE(d0); + MAYUSE(d1); + MAYUSE(q0); + MAYUSE(q1); + MAYUSE(v0); + MAYUSE(v1); + MAYUSE(j64); + + switch (opcode) { + case 0x1E: + case 0x38: + case 0xAE: + case 0xB8: + case 0xBC: + case 0xBD: + return 0; + default: + DEFAULT_VECTOR; + } + return addr; +} diff --git a/src/dynarec/rv64/dynarec_rv64_helper.h b/src/dynarec/rv64/dynarec_rv64_helper.h index 7e6f5e83..683ca3e5 100644 --- a/src/dynarec/rv64/dynarec_rv64_helper.h +++ b/src/dynarec/rv64/dynarec_rv64_helper.h @@ -1140,8 +1140,12 @@ void* rv64_next(x64emu_t* emu, uintptr_t addr); #define dynarec64_F20F STEPNAME(dynarec64_F20F) #define dynarec64_F30F STEPNAME(dynarec64_F30F) +#define dynarec64_64_vector STEPNAME(dynarec64_64_vector) +#define dynarec64_67_vector STEPNAME(dynarec64_67_vector) #define dynarec64_0F_vector STEPNAME(dynarec64_0F_vector) #define dynarec64_660F_vector STEPNAME(dynarec64_660F_vector) +#define dynarec64_F20F_vector STEPNAME(dynarec64_F20F_vector) +#define dynarec64_F30F_vector STEPNAME(dynarec64_F30F_vector) #define geted STEPNAME(geted) #define geted32 STEPNAME(geted32) @@ -1540,6 +1544,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_vector(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); @@ -1558,8 +1563,11 @@ uintptr_t dynarec64_66F0(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int uintptr_t dynarec64_F20F(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ninst, rex_t rex, int* ok, int* need_epilog); uintptr_t dynarec64_F30F(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ninst, rex_t rex, int* ok, int* need_epilog); +uintptr_t dynarec64_64_vector(dynarec_rv64_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_0F_vector(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ninst, rex_t rex, int* ok, int* need_epilog); uintptr_t dynarec64_660F_vector(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ninst, rex_t rex, int* ok, int* need_epilog); +uintptr_t dynarec64_F20F_vector(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ninst, rex_t rex, int* ok, int* need_epilog); +uintptr_t dynarec64_F30F_vector(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ninst, rex_t rex, int* ok, int* need_epilog); #if STEP < 2 #define PASS2(A) |