about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorYang Liu <liuyang22@iscas.ac.cn>2025-08-16 02:13:04 +0800
committerGitHub <noreply@github.com>2025-08-15 20:13:04 +0200
commitf615a10fe111b3e53303f6955246e58003f317de (patch)
treeabe239098363331dc7cf96081aa316736b396f9a /src
parent2d60c8c5b94d82344946354a6ef47638ae0af0d9 (diff)
downloadbox64-f615a10fe111b3e53303f6955246e58003f317de.tar.gz
box64-f615a10fe111b3e53303f6955246e58003f317de.zip
[RV64_DYNAREC] Added more scalar AVX VMOV opcodes (#2942)
* [RV64_DYNAREC] Added more scalar AVX VMOV opcodes

* more
Diffstat (limited to 'src')
-rw-r--r--src/dynarec/rv64/dynarec_rv64_avx.c6
-rw-r--r--src/dynarec/rv64/dynarec_rv64_avx_0f.c96
-rw-r--r--src/dynarec/rv64/dynarec_rv64_avx_66_0f.c64
-rw-r--r--src/dynarec/rv64/dynarec_rv64_helper.h4
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