about summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorYang Liu <liuyang22@iscas.ac.cn>2023-04-04 20:37:25 +0800
committerGitHub <noreply@github.com>2023-04-04 14:37:25 +0200
commit57eae464a33ef1a2e58698e202bb43a14e401325 (patch)
tree48714e3fe1d650edc4fd1732251e79683f50ab93
parent8ec00e90ba89c30f5dfe2cde6deb6b29f61aa2be (diff)
downloadbox64-57eae464a33ef1a2e58698e202bb43a14e401325.tar.gz
box64-57eae464a33ef1a2e58698e202bb43a14e401325.zip
[RV64_DYNAREC] Added 0F BA /4 BT opcode & some fixes (#664)
* [RV64_DYNAREC] Simplified MOVAPS opcode

* [RV64_DYNAREC] Added 0F BA /4 BT opcode

* [RV64_DYNAREC] Fixed 0F 16 MOVHPS opcode
-rw-r--r--src/dynarec/rv64/dynarec_rv64_0f.c42
-rw-r--r--src/dynarec/rv64/dynarec_rv64_helper.h9
2 files changed, 34 insertions, 17 deletions
diff --git a/src/dynarec/rv64/dynarec_rv64_0f.c b/src/dynarec/rv64/dynarec_rv64_0f.c
index f080581d..520b1817 100644
--- a/src/dynarec/rv64/dynarec_rv64_0f.c
+++ b/src/dynarec/rv64/dynarec_rv64_0f.c
@@ -139,18 +139,14 @@ uintptr_t dynarec64_0F(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni
             nextop = F8;
             if(MODREG) {
                 INST_NAME("MOVLHPS Gx,Ex");
-                GETGX(x1);
-                GETEX(x2, 0);
-                LD(x4, wback, 0);
-                SD(x4, gback, fixedaddress+8);
             } else {
                 INST_NAME("MOVHPS Gx,Ex");
                 SMREAD();
-                GETGX(x1);
-                GETEX(x2, 0);
-                LD(x4, wback, 0);
-                SD(x4, gback, fixedaddress+8);
             }
+            GETGX(x1);
+            GETEX(x2, 0);
+            LD(x4, wback, fixedaddress+0);
+            SD(x4, gback, 8);
             break;
         case 0x18:
             nextop = F8;
@@ -187,20 +183,14 @@ uintptr_t dynarec64_0F(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni
             nextop = F8;
             GETGX(x1);
             GETEX(x2, 0);
-            LD(x3, wback, fixedaddress+0);
-            LD(x4, wback, fixedaddress+8);
-            SD(x3, gback, 0);
-            SD(x4, gback, 8);
+            SSE_LOOP_MV_Q(x3);
             break;
         case 0x29:
             INST_NAME("MOVAPS Ex,Gx");
             nextop = F8;
             GETGX(x1);
             GETEX(x2, 0);
-            LD(x3, gback, 0);
-            LD(x4, gback, 8);
-            SD(x3, wback, fixedaddress+0);
-            SD(x4, wback, fixedaddress+8);
+            SSE_LOOP_MV_Q2(x3);
             if(!MODREG)
                 SMWRITE2();
             break;
@@ -516,7 +506,25 @@ uintptr_t dynarec64_0F(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni
                 LHU(gd, ed, fixedaddress);
             }
             break;
-
+        case 0xBA:
+            nextop = F8;
+            switch((nextop>>3)&7) {
+                case 4:
+                    INST_NAME("BT 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);
+                    break;
+                default:
+                    DEFAULT;
+            }
+            break;
         case 0xBE:
             INST_NAME("MOVSX Gd, Eb");
             nextop = F8;
diff --git a/src/dynarec/rv64/dynarec_rv64_helper.h b/src/dynarec/rv64/dynarec_rv64_helper.h
index be5931d6..4fb77d50 100644
--- a/src/dynarec/rv64/dynarec_rv64_helper.h
+++ b/src/dynarec/rv64/dynarec_rv64_helper.h
@@ -374,6 +374,15 @@
     SSE_LOOP_MV_Q_ITEM(s, 0) \
     SSE_LOOP_MV_Q_ITEM(s, 1)
 
+#define SSE_LOOP_MV_Q_ITEM2(s, i)     \
+    LD(s, gback, i*8);                \
+    SD(s, wback, fixedaddress+i*8);
+
+// Loop for SSE opcode that moves 64bits value from gback to wback, use s as scratch.
+#define SSE_LOOP_MV_Q2(s)     \
+    SSE_LOOP_MV_Q_ITEM2(s, 0) \
+    SSE_LOOP_MV_Q_ITEM2(s, 1)
+
 // CALL will use x6 for the call address. Return value can be put in ret (unless ret is -1)
 // R0 will not be pushed/popd if ret is -2
 #define CALL(F, ret) call_c(dyn, ninst, F, x6, ret, 1, 0)