about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorwannacu <wannacu2049@gmail.com>2023-09-04 11:32:45 +0800
committerwannacu <wannacu2049@gmail.com>2023-09-04 16:43:28 +0800
commit90a7602e5ad469b0a83f933614cd1c6871f5622a (patch)
tree0b3ce1c71ff85a23eb22d62331a6436b2351c7e3 /src
parent1e0b8e443bd466ce668181dbfbca97cfe553a5a8 (diff)
downloadbox64-90a7602e5ad469b0a83f933614cd1c6871f5622a.tar.gz
box64-90a7602e5ad469b0a83f933614cd1c6871f5622a.zip
[ARM64_DYNAREC] Added 66 0F 7D/D0 opcodes
Diffstat (limited to 'src')
-rw-r--r--src/dynarec/arm64/dynarec_arm64_660f.c21
-rw-r--r--src/dynarec/arm64/dynarec_arm64_f20f.c17
2 files changed, 36 insertions, 2 deletions
diff --git a/src/dynarec/arm64/dynarec_arm64_660f.c b/src/dynarec/arm64/dynarec_arm64_660f.c
index 85699ba6..20d71349 100644
--- a/src/dynarec/arm64/dynarec_arm64_660f.c
+++ b/src/dynarec/arm64/dynarec_arm64_660f.c
@@ -1836,7 +1836,16 @@ uintptr_t dynarec64_660F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int n
                 VORRQ(q1, q1, v1);      // NAN -> -NAN

             }

             break;

-

+        case 0x7D:

+            INST_NAME("HSUBPD Gx, Ex");  // SSE4 opcode!

+            nextop = F8;

+            GETEX(q1, 0, 0);

+            GETGX(q0, 1);

+            v0 = fpu_get_scratch(dyn);

+            VUZP1Q_64(v0, q0, q1);

+            VUZP2Q_64(q0, q0, q1);

+            VFSUBQD(q0, v0, q0);

+            break;

         case 0x7E:

             INST_NAME("MOVD Ed,Gx");

             nextop = F8;

@@ -2306,6 +2315,16 @@ uintptr_t dynarec64_660F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int n
             VDUPQ_16(v0, v0, 0);    // only the low 8bits will be used anyway

             USHLQ_16(q0, q0, v0);   // SHR x8

             break;

+        case 0xD0:

+            INST_NAME("ADDSUBPD Gx,Ex");

+            nextop = F8;

+            GETGX(q0, 1);

+            GETEX(q1, 0, 0);

+            v0 = fpu_get_scratch(dyn);

+            VFSUBQD(v0, q0, q1);

+            VFADDQD(q0, q0, q1);

+            VMOVeD(q0, 0, v0, 0);

+            break;

         case 0xD2:

             INST_NAME("PSRLD Gx,Ex");

             nextop = F8;

diff --git a/src/dynarec/arm64/dynarec_arm64_f20f.c b/src/dynarec/arm64/dynarec_arm64_f20f.c
index c2d8a46e..99edd187 100644
--- a/src/dynarec/arm64/dynarec_arm64_f20f.c
+++ b/src/dynarec/arm64/dynarec_arm64_f20f.c
@@ -376,7 +376,22 @@ uintptr_t dynarec64_F20F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int n
             }

             VFADDPQS(v0, v0, v1);

             break;

-            

+        case 0x7D:

+            INST_NAME("HSUBPS Gx, Ex");

+            nextop = F8;

+            GETGX(v0, 1);

+            if(MODREG) {

+                v1 = sse_get_reg(dyn, ninst, x1, (nextop&7)+(rex.b<<3), 0);

+            } else {

+                addr = geted(dyn, addr, ninst, nextop, &ed, x1, &fixedaddress, &unscaled, 0xfff<<4, 15, rex, NULL, 0, 0);

+                v1 = fpu_get_scratch(dyn);

+                VLD128(v1, ed, fixedaddress);

+            }

+            d0 = fpu_get_scratch(dyn);

+            VUZP1Q_32(d0, v0, v1);

+            VUZP2Q_32(v0, v0, v1);

+            VFSUBQS(v0, d0, v0);

+            break;

         case 0xC2:

             INST_NAME("CMPSD Gx, Ex, Ib");

             nextop = F8;