about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorYang Liu <liuyang22@iscas.ac.cn>2023-04-07 19:30:19 +0800
committerGitHub <noreply@github.com>2023-04-07 13:30:19 +0200
commitaa7ee8e65db1e07a875a882b0b43edf5b413152a (patch)
tree4faabf31818da4e421c717a89d7801b87b5b2194 /src
parent64a6a28c3090f87a2c666906bd25c5fca9a436d6 (diff)
downloadbox64-aa7ee8e65db1e07a875a882b0b43edf5b413152a.tar.gz
box64-aa7ee8e65db1e07a875a882b0b43edf5b413152a.zip
[RV64_DYNAREC] Added more opcodes for Stardew Valley and some fixes (#673)
* [RV64_DYNAREC] Added 66 0F D6 MOVQ opcode

* [RV64_DYNAREC] Added 66 0F 56 ORPD opcode

* [RV64_DYNAREC] Fixed emit_or32c

* [RV64_DYNAREC] Added 0F BA /7 BTC opcode
Diffstat (limited to 'src')
-rw-r--r--src/dynarec/rv64/dynarec_rv64_0f.c18
-rw-r--r--src/dynarec/rv64/dynarec_rv64_660f.c19
-rw-r--r--src/dynarec/rv64/dynarec_rv64_emit_logic.c1
3 files changed, 38 insertions, 0 deletions
diff --git a/src/dynarec/rv64/dynarec_rv64_0f.c b/src/dynarec/rv64/dynarec_rv64_0f.c
index ef988fd1..a1ef5734 100644
--- a/src/dynarec/rv64/dynarec_rv64_0f.c
+++ b/src/dynarec/rv64/dynarec_rv64_0f.c
@@ -521,6 +521,24 @@ uintptr_t dynarec64_0F(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni
                     ANDI(xFlags, xFlags, ~1);
                     OR(xFlags, xFlags, x3);
                     break;
+                case 7:
+                    INST_NAME("BTC Ed, Ib");
+                    SETFLAGS(X_CF, SF_SUBSET);
+                    SET_DFNONE();
+                    GETED(1);
+                    u8 = F8;
+                    u8&=rex.w?0x3f:0x1f;
+                    SRLIxw(x3, ed, u8);
+                    ANDI(x3, x3, 1); // F_CF is 1
+                    ANDI(xFlags, xFlags, ~1);
+                    OR(xFlags, xFlags, x3);
+                    if (u8 <= 10) {
+                        XORI(ed, ed, (1LL << u8));
+                    } else {
+                        MOV64xw(x3, (1LL << u8));
+                        XOR(ed, ed, x3);
+                    }
+                    break;
                 default:
                     DEFAULT;
             }
diff --git a/src/dynarec/rv64/dynarec_rv64_660f.c b/src/dynarec/rv64/dynarec_rv64_660f.c
index 246371f1..0de4e4eb 100644
--- a/src/dynarec/rv64/dynarec_rv64_660f.c
+++ b/src/dynarec/rv64/dynarec_rv64_660f.c
@@ -141,6 +141,13 @@ uintptr_t dynarec64_660F(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int
             GETGX(x2);
             SSE_LOOP_Q(x3, x4, NOT(x3, x3); AND(x3, x3, x4));
             break;
+        case 0x56:
+            INST_NAME("ORPD Gx, Ex");
+            nextop = F8;
+            GETEX(x1, 0);
+            GETGX(x2);
+            SSE_LOOP_Q(x3, x4, OR(x3, x3, x4));
+            break;
         case 0x57:
             INST_NAME("XORPD Gx, Ex");
             nextop = F8;
@@ -433,6 +440,18 @@ uintptr_t dynarec64_660F(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int
             GETEX(x2, 0);
             SSE_LOOP_Q(x3, x4, ADD(x3, x3, x4));
             break;
+        case 0xD6:
+            INST_NAME("MOVQ Ex, Gx");
+            nextop = F8;
+            GETGXSD(d0);
+            GETEX(x2, 0);
+            FSD(d0, wback, fixedaddress+0);
+            if (MODREG) {
+                SD(xZR, wback, fixedaddress+8);
+            } else {
+                SMWRITE2();
+            }
+            break;
         case 0xDB:
             INST_NAME("PAND Gx,Ex");
             nextop = F8;
diff --git a/src/dynarec/rv64/dynarec_rv64_emit_logic.c b/src/dynarec/rv64/dynarec_rv64_emit_logic.c
index 9ee739bb..693a15c1 100644
--- a/src/dynarec/rv64/dynarec_rv64_emit_logic.c
+++ b/src/dynarec/rv64/dynarec_rv64_emit_logic.c
@@ -269,6 +269,7 @@ void emit_or32c(dynarec_rv64_t* dyn, int ninst, rex_t rex, int s1, int64_t c, in
 
     // test sign bit before zeroup.
     IFX(X_SF) {
+        if (!rex.w) SEXT_W(s1, s1);
         BGE(s1, xZR, 8);
         ORI(xFlags, xFlags, 1 << F_SF);
     }