about summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorYang Liu <liuyang22@iscas.ac.cn>2025-09-09 03:30:04 +0800
committerGitHub <noreply@github.com>2025-09-08 21:30:04 +0200
commitc6bb8b335a3acd0a5687cdd101e0e32aae6c032f (patch)
tree374d01656e9bbb659c04e22cda5e517ca256f2f9
parent464fdc3ebe5816c281b0cf9e1960cb33386e29e9 (diff)
downloadbox64-c6bb8b335a3acd0a5687cdd101e0e32aae6c032f.tar.gz
box64-c6bb8b335a3acd0a5687cdd101e0e32aae6c032f.zip
[RV64_DYNAREC] Added more scalar avx opcodes and fixed a typo (#3009)
-rw-r--r--src/dynarec/rv64/dynarec_rv64_avx_0f.c39
-rw-r--r--src/dynarec/rv64/dynarec_rv64_avx_66_0f38.c2
2 files changed, 40 insertions, 1 deletions
diff --git a/src/dynarec/rv64/dynarec_rv64_avx_0f.c b/src/dynarec/rv64/dynarec_rv64_avx_0f.c
index 987bf036..ec68be6e 100644
--- a/src/dynarec/rv64/dynarec_rv64_avx_0f.c
+++ b/src/dynarec/rv64/dynarec_rv64_avx_0f.c
@@ -46,6 +46,45 @@ uintptr_t dynarec64_AVX_0F(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, in
     rex_t rex = vex.rex;
 
     switch (opcode) {
+        case 0x10:
+            INST_NAME("VMOVUPS Gx, Ex");
+            nextop = F8;
+            GETEX(x1, 0, vex.l ? 24 : 8);
+            GETGX();
+            GETGY();
+            LD(x3, wback, fixedaddress + 0);
+            LD(x4, wback, fixedaddress + 8);
+            SD(x3, gback, gdoffset + 0);
+            SD(x4, gback, gdoffset + 8);
+            if (vex.l) {
+                GETEY();
+                LD(x3, wback, fixedaddress + 0);
+                LD(x4, wback, fixedaddress + 8);
+                SD(x3, gback, gyoffset + 0);
+                SD(x4, gback, gyoffset + 8);
+            } else
+                YMM0(gd);
+            break;
+        case 0x11:
+            INST_NAME("VMOVUPS Ex, Gx");
+            nextop = F8;
+            GETEX(x1, 0, vex.l ? 24 : 8);
+            GETGX();
+            GETGY();
+            LD(x3, gback, gdoffset + 0);
+            LD(x4, gback, gdoffset + 8);
+            SD(x3, wback, fixedaddress + 0);
+            SD(x4, wback, fixedaddress + 8);
+            if (vex.l) {
+                GETEY();
+                LD(x3, gback, gyoffset + 0);
+                LD(x4, gback, gyoffset + 8);
+                SD(x3, wback, fixedaddress + 0);
+                SD(x4, wback, fixedaddress + 8);
+            } else
+                YMM0(ed);
+            if (!MODREG) SMWRITE2();
+            break;
         case 0x12:
             nextop = F8;
             GETEX(x2, 0, 8);
diff --git a/src/dynarec/rv64/dynarec_rv64_avx_66_0f38.c b/src/dynarec/rv64/dynarec_rv64_avx_66_0f38.c
index 40ec2518..65b9d47b 100644
--- a/src/dynarec/rv64/dynarec_rv64_avx_66_0f38.c
+++ b/src/dynarec/rv64/dynarec_rv64_avx_66_0f38.c
@@ -590,7 +590,7 @@ uintptr_t dynarec64_AVX_66_0F38(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t i
                     AND(x6, x4, x2);
                     AND(x7, x5, x3);
                     OR(x6, x6, x7);
-                    BNEZ(x3, 4 + 4);
+                    BNEZ(x6, 4 + 4);
                     ORI(xFlags, xFlags, 1 << F_CF);
                 }
             }