about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorYang Liu <liuyang22@iscas.ac.cn>2023-04-14 17:32:35 +0800
committerGitHub <noreply@github.com>2023-04-14 11:32:35 +0200
commit27f3ba941f32586160f55aa3f2082c864e78d5f2 (patch)
treee3c4a27177ed7c320e46a62827f04877bb19fe6d /src
parent9413d5deb4ef1223dedc9b650885abb47e7077b1 (diff)
downloadbox64-27f3ba941f32586160f55aa3f2082c864e78d5f2.tar.gz
box64-27f3ba941f32586160f55aa3f2082c864e78d5f2.zip
[RV64_DYNAREC] Added more opcodes for SV (#700)
* [RV64_DYNAREC] Added 66 0F F8 PSUBB opcode

* [RV64_DYNAREC] Added 66 0F FB PSUBQ opcode

* [RV64_DYNAREC] Added 66 0F 68 PUNPCKHBW opcode

* [RV64_DYNAREC] Added F2 0F 5A CVTSD2SS opcode

* [RV64_DYNAREC] Added F2 0F 12 MOVDDUP opcode

* [RV64_DYNAREC] Fixed F2 0F 5A CVTSD2SS opcode
Diffstat (limited to 'src')
-rw-r--r--src/dynarec/rv64/dynarec_rv64_660f.c44
-rw-r--r--src/dynarec/rv64/dynarec_rv64_f20f.c16
2 files changed, 60 insertions, 0 deletions
diff --git a/src/dynarec/rv64/dynarec_rv64_660f.c b/src/dynarec/rv64/dynarec_rv64_660f.c
index f3e6d2cc..9c102d01 100644
--- a/src/dynarec/rv64/dynarec_rv64_660f.c
+++ b/src/dynarec/rv64/dynarec_rv64_660f.c
@@ -409,6 +409,30 @@ uintptr_t dynarec64_660F(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int
                 }
             }
             break;
+        case 0x68:
+            INST_NAME("PUNPCKHBW Gx,Ex");
+            nextop = F8;
+            GETGX(x1);
+            for(int i=0; i<8; ++i) {
+                // GX->ub[2 * i] = GX->ub[i + 8];
+                LBU(x3, gback, i+8);
+                SB(x3, gback, 2*i);
+            }
+            if (MODREG && gd==(nextop&7)+(rex.b<<3)) {
+                for(int i=0; i<8; ++i) {
+                    // GX->ub[2 * i + 1] = GX->ub[2 * i];
+                    LBU(x3, gback, 2*i);
+                    SB(x3, gback, 2*i+1);
+                }
+            } else {
+                GETEX(x2, 0);
+                for(int i=0; i<8; ++i) {
+                    // GX->ub[2 * i + 1] = EX->ub[i + 8];
+                    LBU(x3, wback, fixedaddress+i+8);
+                    SB(x3, gback, 2*i+1);
+                }
+            }
+            break;
         case 0x69:
             INST_NAME("PUNPCKHWD Gx,Ex");
             nextop = F8;
@@ -990,6 +1014,19 @@ uintptr_t dynarec64_660F(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int
             SD(x4, gback, 0);
             SD(x5, gback, 8);
             break;
+        case 0xF8:
+            INST_NAME("PSUBB Gx,Ex");
+            nextop = F8;
+            GETGX(x1);
+            GETEX(x2, 0);
+            for(int i=0; i<16; ++i) {
+                // GX->sb[i] -= EX->sb[i];
+                LB(x3, wback, fixedaddress+i);
+                LB(x4, gback, i);
+                SUB(x3, x4, x3);
+                SB(x3, gback, i);
+            }
+            break;
         case 0xFA:
             INST_NAME("PSUBD Gx,Ex");
             nextop = F8;
@@ -997,6 +1034,13 @@ uintptr_t dynarec64_660F(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int
             GETEX(x2, 0);
             SSE_LOOP_D(x3, x4, SUBW(x3, x3, x4));
             break;
+        case 0xFB:
+            INST_NAME("PSUBQ Gx,Ex");
+            nextop = F8;
+            GETGX(x1);
+            GETEX(x2, 0);
+            SSE_LOOP_Q(x3, x4, SUB(x3, x3, x4));
+            break;
         case 0xFC:
             INST_NAME("PADDB Gx,Ex");
             nextop = F8;
diff --git a/src/dynarec/rv64/dynarec_rv64_f20f.c b/src/dynarec/rv64/dynarec_rv64_f20f.c
index ee1e14ca..34e471b6 100644
--- a/src/dynarec/rv64/dynarec_rv64_f20f.c
+++ b/src/dynarec/rv64/dynarec_rv64_f20f.c
@@ -79,6 +79,15 @@ uintptr_t dynarec64_F20F(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int
                 SMWRITE2();
             }
             break;
+        case 0x12:
+            INST_NAME("MOVDDUP Gx, Ex");
+            nextop = F8;
+            GETGX(x1);
+            GETEX(x2, 0);
+            LD(x3, wback, fixedaddress+0);
+            SD(x3, gback, 0);
+            SD(x3, gback, 8);
+            break;
         case 0x2A:
             INST_NAME("CVTSI2SD Gx, Ed");
             nextop = F8;
@@ -149,6 +158,13 @@ uintptr_t dynarec64_F20F(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int
             GETEXSD(v1, 0);
             FMULD(v0, v0, v1);
             break;
+        case 0x5A:
+            INST_NAME("CVTSD2SS Gx, Ex");
+            nextop = F8;
+            GETEXSD(v1, 0);
+            GETGXSS_empty(v0);
+            FCVTSD(v0, v1);
+            break;
         case 0x5C:
             INST_NAME("SUBSD Gx, Ex");
             nextop = F8;