about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2023-03-22 17:55:06 +0000
committerptitSeb <sebastien.chev@gmail.com>2023-03-22 17:55:06 +0000
commitb6188abeeb034062a240d3dd56d0b1cfe0eb69a0 (patch)
tree4f4f7241fcb65aa9ccccf7f9715aaee970265c5a /src
parent1cd9fac9fb941c93fe8f0117cbfb673615862743 (diff)
downloadbox64-b6188abeeb034062a240d3dd56d0b1cfe0eb69a0.tar.gz
box64-b6188abeeb034062a240d3dd56d0b1cfe0eb69a0.zip
[RV64_DYNAREC] Added F3 0F 10 and 11 opcodes
Diffstat (limited to 'src')
-rw-r--r--src/dynarec/rv64/dynarec_rv64_f20f.c2
-rw-r--r--src/dynarec/rv64/dynarec_rv64_f30f.c33
2 files changed, 34 insertions, 1 deletions
diff --git a/src/dynarec/rv64/dynarec_rv64_f20f.c b/src/dynarec/rv64/dynarec_rv64_f20f.c
index b6bc6086..1cbe5d00 100644
--- a/src/dynarec/rv64/dynarec_rv64_f20f.c
+++ b/src/dynarec/rv64/dynarec_rv64_f20f.c
@@ -58,7 +58,7 @@ uintptr_t dynarec64_F20F(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int
             } else {
                 SMREAD();
                 v0 = sse_get_reg_empty(dyn, ninst, x1, gd, 0);
-                addr = geted(dyn, addr, ninst, nextop, &ed, x1, x2, &fixedaddress, rex, NULL, 1, 0);
+                addr = geted(dyn, addr, ninst, nextop, &ed, x1, x2, &fixedaddress, rex, NULL, 8, 0);
                 FLD(v0, ed, fixedaddress);
                 // reset upper part
                 SD(xZR, xEmu, offsetof(x64emu_t, xmm[gd])+8);
diff --git a/src/dynarec/rv64/dynarec_rv64_f30f.c b/src/dynarec/rv64/dynarec_rv64_f30f.c
index bceaa6e7..4aa1a12b 100644
--- a/src/dynarec/rv64/dynarec_rv64_f30f.c
+++ b/src/dynarec/rv64/dynarec_rv64_f30f.c
@@ -47,6 +47,39 @@ uintptr_t dynarec64_F30F(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int
     MAYUSE(j64);
 
     switch(opcode) {
+        case 0x10:
+            INST_NAME("MOVSS Gx, Ex");
+            nextop = F8;
+            GETG;
+            if(MODREG) {
+                v0 = sse_get_reg(dyn, ninst, x1, gd, 1);
+                q0 = sse_get_reg(dyn, ninst, x1, (nextop&7) + (rex.b<<3), 1);
+                FMVS(v0, q0);
+            } else {
+                v0 = sse_get_reg_empty(dyn, ninst, x1, gd, 1);
+                SMREAD();
+                addr = geted(dyn, addr, ninst, nextop, &ed, x1, x2, &fixedaddress, rex, NULL, 8, 0);
+                FLW(v0, ed, fixedaddress);
+                // reset upper part
+                SW(xZR, xEmu, offsetof(x64emu_t, xmm[gd])+4);
+                SD(xZR, xEmu, offsetof(x64emu_t, xmm[gd])+8);
+            }
+            break;
+        case 0x11:
+            INST_NAME("MOVSS Ex, Gx");
+            nextop = F8;
+            GETG;
+            v0 = sse_get_reg(dyn, ninst, x1, gd, 1);
+            if(MODREG) {
+                q0 = sse_get_reg(dyn, ninst, x1, (nextop&7) + (rex.b<<3), 1);
+                FMVS(q0, v0);
+            } else {
+                addr = geted(dyn, addr, ninst, nextop, &ed, x1, x2, &fixedaddress, rex, NULL, 1, 0);
+                FSW(v0, ed, fixedaddress);
+                SMWRITE2();
+            }
+            break;
+            
         case 0x1E:
             INST_NAME("NOP / ENDBR32 / ENDBR64");
             nextop = F8;