mirror of
https://github.com/ptitSeb/box64.git
synced 2024-11-23 09:54:37 +08:00
[RV64_DYNAREC] Added more boilerplate for vector (#1916)
This commit is contained in:
parent
fd73a2bc8b
commit
887dee83eb
@ -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()
|
||||
|
||||
|
@ -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;
|
||||
|
@ -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");
|
||||
|
82
src/dynarec/rv64/dynarec_rv64_64_vector.c
Normal file
82
src/dynarec/rv64/dynarec_rv64_64_vector.c
Normal file
@ -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;
|
||||
}
|
116
src/dynarec/rv64/dynarec_rv64_67_vector.c
Normal file
116
src/dynarec/rv64/dynarec_rv64_67_vector.c
Normal file
@ -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;
|
||||
}
|
54
src/dynarec/rv64/dynarec_rv64_f20f_vector.c
Normal file
54
src/dynarec/rv64/dynarec_rv64_f20f_vector.c
Normal file
@ -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;
|
||||
}
|
62
src/dynarec/rv64/dynarec_rv64_f30f_vector.c
Normal file
62
src/dynarec/rv64/dynarec_rv64_f30f_vector.c
Normal file
@ -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;
|
||||
}
|
@ -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)
|
||||
|
Loading…
Reference in New Issue
Block a user