diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/dynarec/rv64/dynarec_rv64_avx.c | 6 | ||||
| -rw-r--r-- | src/dynarec/rv64/dynarec_rv64_avx_0f.c | 96 | ||||
| -rw-r--r-- | src/dynarec/rv64/dynarec_rv64_avx_66_0f.c | 64 | ||||
| -rw-r--r-- | src/dynarec/rv64/dynarec_rv64_helper.h | 4 |
4 files changed, 169 insertions, 1 deletions
diff --git a/src/dynarec/rv64/dynarec_rv64_avx.c b/src/dynarec/rv64/dynarec_rv64_avx.c index 95908176..0d4a6f2c 100644 --- a/src/dynarec/rv64/dynarec_rv64_avx.c +++ b/src/dynarec/rv64/dynarec_rv64_avx.c @@ -48,7 +48,11 @@ uintptr_t dynarec64_AVX(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int n uint8_t opcode = PK(0); rex_t rex = vex.rex; - if ((vex.m == VEX_M_0F) && (vex.p == VEX_P_F3)) + if ((vex.m == VEX_M_0F) && (vex.p == VEX_P_NONE)) + addr = dynarec64_AVX_0F(dyn, addr, ip, ninst, vex, ok, need_epilog); + else if ((vex.m == VEX_M_0F) && (vex.p == VEX_P_66)) + addr = dynarec64_AVX_66_0F(dyn, addr, ip, ninst, vex, ok, need_epilog); + else if ((vex.m == VEX_M_0F) && (vex.p == VEX_P_F3)) addr = dynarec64_AVX_F3_0F(dyn, addr, ip, ninst, vex, ok, need_epilog); else { DEFAULT; diff --git a/src/dynarec/rv64/dynarec_rv64_avx_0f.c b/src/dynarec/rv64/dynarec_rv64_avx_0f.c new file mode 100644 index 00000000..95b8972b --- /dev/null +++ b/src/dynarec/rv64/dynarec_rv64_avx_0f.c @@ -0,0 +1,96 @@ +#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 "my_cpuid.h" +#include "emu/x87emu_private.h" +#include "emu/x64shaext.h" + +#include "rv64_printer.h" +#include "dynarec_rv64_private.h" +#include "dynarec_rv64_functions.h" +#include "../dynarec_helper.h" + +uintptr_t dynarec64_AVX_0F(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ninst, vex_t vex, int* ok, int* need_epilog) +{ + (void)ip; + (void)need_epilog; + + uint8_t opcode = F8; + uint8_t nextop, u8; + uint8_t gd, ed, vd; + uint8_t wback, wb1, wb2, gback, vback, gyback; + uint8_t eb1, eb2, gb1, gb2; + int32_t i32, i32_; + int cacheupd = 0; + int v0, v1, v2; + int q0, q1, q2; + int d0, d1, d2; + int s0; + uint64_t tmp64u, u64; + int64_t j64; + int64_t fixedaddress, gdoffset, vxoffset, gyoffset; + int unscaled; + + rex_t rex = vex.rex; + + switch (opcode) { + case 0x28: + INST_NAME("VMOVAPS Gx, Ex"); + nextop = F8; + GETEX(x2, 0, vex.l ? 24 : 8); + GETGX(); + GETGY(); + LD(x3, wback, fixedaddress); + SD(x3, gback, gdoffset); + LD(x3, wback, fixedaddress + 8); + SD(x3, gback, gdoffset + 8); + if (vex.l) { + GETEY(); + LD(x3, wback, fixedaddress); + SD(x3, gyback, gyoffset); + LD(x3, wback, fixedaddress + 8); + SD(x3, gyback, gyoffset + 8); + } else { + SD(xZR, gyback, gyoffset); + SD(xZR, gyback, gyoffset + 8); + } + break; + case 0x29: + INST_NAME("VMOVAPS Ex, Gx"); + nextop = F8; + GETEX(x2, 0, vex.l ? 24 : 8); + GETGX(); + LD(x3, gback, gdoffset); + SD(x3, wback, fixedaddress); + LD(x3, gback, gdoffset + 8); + SD(x3, wback, fixedaddress + 8); + if (vex.l) { + GETEY(); + GETGY(); + LD(x3, gyback, gyoffset); + SD(x3, wback, fixedaddress); + LD(x3, gyback, gyoffset + 8); + SD(x3, wback, fixedaddress + 8); + } else if (MODREG) { + GETEY(); + SD(xZR, wback, fixedaddress); + SD(xZR, wback, fixedaddress + 8); + } + break; + default: + DEFAULT; + } + return addr; +} diff --git a/src/dynarec/rv64/dynarec_rv64_avx_66_0f.c b/src/dynarec/rv64/dynarec_rv64_avx_66_0f.c new file mode 100644 index 00000000..c0d177dc --- /dev/null +++ b/src/dynarec/rv64/dynarec_rv64_avx_66_0f.c @@ -0,0 +1,64 @@ +#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 "my_cpuid.h" +#include "emu/x87emu_private.h" +#include "emu/x64shaext.h" + +#include "rv64_printer.h" +#include "dynarec_rv64_private.h" +#include "dynarec_rv64_functions.h" +#include "../dynarec_helper.h" + +uintptr_t dynarec64_AVX_66_0F(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ninst, vex_t vex, int* ok, int* need_epilog) +{ + (void)ip; + (void)need_epilog; + + uint8_t opcode = F8; + uint8_t nextop, u8; + uint8_t gd, ed, vd; + uint8_t wback, wb1, wb2, gback, vback, gyback; + uint8_t eb1, eb2, gb1, gb2; + int32_t i32, i32_; + int cacheupd = 0; + int v0, v1, v2; + int q0, q1, q2; + int d0, d1, d2; + int s0; + uint64_t tmp64u, u64; + int64_t j64; + int64_t fixedaddress, gdoffset, vxoffset, gyoffset; + int unscaled; + + rex_t rex = vex.rex; + + switch (opcode) { + case 0x6E: + INST_NAME("VMOVD Gx, Ed"); + nextop = F8; + GETED(0); + GETGX(); + GETGY(); + SD(ed, gback, gdoffset); + SD(xZR, gback, gdoffset + 8); + SD(xZR, gyback, gyoffset); + SD(xZR, gyback, gyoffset + 8); + break; + default: + DEFAULT; + } + return addr; +} diff --git a/src/dynarec/rv64/dynarec_rv64_helper.h b/src/dynarec/rv64/dynarec_rv64_helper.h index 7ed1db51..7fdcad6b 100644 --- a/src/dynarec/rv64/dynarec_rv64_helper.h +++ b/src/dynarec/rv64/dynarec_rv64_helper.h @@ -1287,6 +1287,8 @@ #define dynarec64_F30F_vector STEPNAME(dynarec64_F30F_vector) #define dynarec64_AVX STEPNAME(dynarec64_AVX) +#define dynarec64_AVX_0F STEPNAME(dynarec64_AVX_0F) +#define dynarec64_AVX_66_0F STEPNAME(dynarec64_AVX_66_0F) #define dynarec64_AVX_F3_0F STEPNAME(dynarec64_AVX_F3_0F) #define geted STEPNAME(geted) @@ -1736,6 +1738,8 @@ uintptr_t dynarec64_F20F_vector(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t i 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); uintptr_t dynarec64_AVX(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ninst, vex_t vex, int* ok, int* need_epilog); +uintptr_t dynarec64_AVX_0F(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ninst, vex_t vex, int* ok, int* need_epilog); +uintptr_t dynarec64_AVX_66_0F(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ninst, vex_t vex, int* ok, int* need_epilog); uintptr_t dynarec64_AVX_F3_0F(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ninst, vex_t vex, int* ok, int* need_epilog); #if STEP < 2 |