diff options
| author | Yang Liu <liuyang22@iscas.ac.cn> | 2025-08-22 05:44:40 +0800 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-08-21 23:44:40 +0200 |
| commit | cea8f9435823d86ca3a2c2566ad52b2c71e2e69b (patch) | |
| tree | f9c6baa3feaff9a0e27d068028971687a800f0f8 /src | |
| parent | d476217f4c53ed5697086fd477cc4058e78fbae1 (diff) | |
| download | box64-cea8f9435823d86ca3a2c2566ad52b2c71e2e69b.tar.gz box64-cea8f9435823d86ca3a2c2566ad52b2c71e2e69b.zip | |
[RV64_DYNAREC] Added more scalar avx opcodes (#2961)
Diffstat (limited to 'src')
| -rw-r--r-- | src/dynarec/la64/dynarec_la64_avx_f3_0f.c | 2 | ||||
| -rw-r--r-- | src/dynarec/rv64/dynarec_rv64_avx.c | 2 | ||||
| -rw-r--r-- | src/dynarec/rv64/dynarec_rv64_avx_f2_0f.c | 88 | ||||
| -rw-r--r-- | src/dynarec/rv64/dynarec_rv64_avx_f3_0f.c | 12 | ||||
| -rw-r--r-- | src/dynarec/rv64/dynarec_rv64_helper.h | 2 |
5 files changed, 105 insertions, 1 deletions
diff --git a/src/dynarec/la64/dynarec_la64_avx_f3_0f.c b/src/dynarec/la64/dynarec_la64_avx_f3_0f.c index 09b0ec3b..1c18f724 100644 --- a/src/dynarec/la64/dynarec_la64_avx_f3_0f.c +++ b/src/dynarec/la64/dynarec_la64_avx_f3_0f.c @@ -418,7 +418,7 @@ uintptr_t dynarec64_AVX_F3_0F(dynarec_la64_t* dyn, uintptr_t addr, uintptr_t ip, } break; case 0x7E: - INST_NAME("VMOVD Gx, Ex"); + INST_NAME("VMOVQ Gx, Ex"); nextop = F8; GETEYSD(q1, 0, 0); GETGYx_empty(q0); diff --git a/src/dynarec/rv64/dynarec_rv64_avx.c b/src/dynarec/rv64/dynarec_rv64_avx.c index 12cce037..791307f6 100644 --- a/src/dynarec/rv64/dynarec_rv64_avx.c +++ b/src/dynarec/rv64/dynarec_rv64_avx.c @@ -52,6 +52,8 @@ uintptr_t dynarec64_AVX(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int n 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_F2)) + addr = dynarec64_AVX_F2_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 if ((vex.m == VEX_M_0F38) && (vex.p == VEX_P_66)) diff --git a/src/dynarec/rv64/dynarec_rv64_avx_f2_0f.c b/src/dynarec/rv64/dynarec_rv64_avx_f2_0f.c new file mode 100644 index 00000000..6b9f916b --- /dev/null +++ b/src/dynarec/rv64/dynarec_rv64_avx_f2_0f.c @@ -0,0 +1,88 @@ +#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_F2_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; + 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 0x10: + INST_NAME("VMOVSD Gx, [Vx,] Ex"); + nextop = F8; + GETEX(x1, 0, 1); + GETGX(); + GETGY(); + LD(x3, wback, fixedaddress); + SD(x3, gback, gdoffset); + if (MODREG) { + GETVX(); + LD(x3, vback, vxoffset + 8); + SD(x3, gback, gdoffset + 8); + } else { + SD(xZR, gback, gdoffset + 8); + } + SD(xZR, gback, gyoffset + 0); + SD(xZR, gback, gyoffset + 8); + break; + case 0x11: + INST_NAME("VMOVSD Ex, [Vx,] Gx"); + nextop = F8; + GETEX(x1, 0, 24); + GETGX(); + GETGY(); + LD(x3, gback, gdoffset); + SD(x3, wback, fixedaddress); + if (MODREG) { + GETVX(); + LD(x3, vback, vxoffset + 8); + SD(x3, wback, fixedaddress + 8); + GETEY(); + SD(xZR, wback, fixedaddress + 0); + SD(xZR, wback, fixedaddress + 8); + } + break; + default: + DEFAULT; + } + return addr; +} diff --git a/src/dynarec/rv64/dynarec_rv64_avx_f3_0f.c b/src/dynarec/rv64/dynarec_rv64_avx_f3_0f.c index 6dbe2d37..7761c55f 100644 --- a/src/dynarec/rv64/dynarec_rv64_avx_f3_0f.c +++ b/src/dynarec/rv64/dynarec_rv64_avx_f3_0f.c @@ -165,6 +165,18 @@ uintptr_t dynarec64_AVX_F3_0F(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, SD(xZR, gback, gyoffset); SD(xZR, gback, gyoffset + 8); break; + case 0x7E: + INST_NAME("VMOVQ Gx, Ex"); + nextop = F8; + GETEX(x1, 0, 1); + GETGX(); + GETGY(); + LD(x3, wback, fixedaddress); + SD(x3, gback, gdoffset + 0); + SD(xZR, gback, gdoffset + 8); + SD(xZR, gback, gyoffset + 0); + SD(xZR, gback, gyoffset + 8); + break; case 0xC2: INST_NAME("VCMPSS Gx, Vx, Ex, Ib"); nextop = F8; diff --git a/src/dynarec/rv64/dynarec_rv64_helper.h b/src/dynarec/rv64/dynarec_rv64_helper.h index b5ac7225..ed7c594e 100644 --- a/src/dynarec/rv64/dynarec_rv64_helper.h +++ b/src/dynarec/rv64/dynarec_rv64_helper.h @@ -1294,6 +1294,7 @@ #define dynarec64_AVX_66_0F STEPNAME(dynarec64_AVX_66_0F) #define dynarec64_AVX_66_0F38 STEPNAME(dynarec64_AVX_66_0F38) #define dynarec64_AVX_66_0F3A STEPNAME(dynarec64_AVX_66_0F3A) +#define dynarec64_AVX_F2_0F STEPNAME(dynarec64_AVX_F2_0F) #define dynarec64_AVX_F3_0F STEPNAME(dynarec64_AVX_F3_0F) #define geted STEPNAME(geted) @@ -1747,6 +1748,7 @@ uintptr_t dynarec64_AVX_0F(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, in 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_66_0F38(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_0F3A(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ninst, vex_t vex, int* ok, int* need_epilog); +uintptr_t dynarec64_AVX_F2_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 |