about summary refs log tree commit diff stats
path: root/src/dynarec
diff options
context:
space:
mode:
authorwannacu <wannacu2049@gmail.com>2023-08-21 11:31:41 +0800
committerwannacu <wannacu2049@gmail.com>2023-08-21 11:47:09 +0800
commitcd0aad731adede316ea036692ef92669474c1256 (patch)
tree0d63281601227510e012a9ec2cf5de86144acdf7 /src/dynarec
parent8e7afcc5fb6c320126c06bc46f7691fb2199634d (diff)
downloadbox64-cd0aad731adede316ea036692ef92669474c1256.tar.gz
box64-cd0aad731adede316ea036692ef92669474c1256.zip
[ARM64_DYNAREC] Added 0F F1/F3/F7 opcodes
Diffstat (limited to 'src/dynarec')
-rw-r--r--src/dynarec/arm64/dynarec_arm64_0f.c55
1 files changed, 46 insertions, 9 deletions
diff --git a/src/dynarec/arm64/dynarec_arm64_0f.c b/src/dynarec/arm64/dynarec_arm64_0f.c
index e4aa3657..a3ef9ef7 100644
--- a/src/dynarec/arm64/dynarec_arm64_0f.c
+++ b/src/dynarec/arm64/dynarec_arm64_0f.c
@@ -1975,7 +1975,16 @@ uintptr_t dynarec64_0F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                 VEOR(q0, q0, q1);

             }

             break;

-

+        case 0xF1:

+            INST_NAME("PSLLW Gm,Em");

+            nextop = F8;

+            GETGM(d0);

+            GETEM(d1, 0);

+            v0 = fpu_get_scratch(dyn);

+            VMOVHto(x1, d1, 0);

+            VDUPH(v0, x1);

+            USHL_16(d0, d0, v0);

+            break;

         case 0xF2:

             INST_NAME("PSLLD Gm,Em");

             nextop = F8;

@@ -1987,6 +1996,13 @@ uintptr_t dynarec64_0F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
             SQXTN_32(v0, v0); // 2*q1 in 32bits now

             SSHL_32(d0, d0, v0);

             break;

+        case 0xF3:

+            INST_NAME("PSLLQ Gm,Em");

+            nextop = F8;

+            GETGM(d0);

+            GETEM(d1, 0);

+            USHL_R_64(d0, d0, d1);

+            break;

         case 0xF4:

             INST_NAME("PMULUDQ Gx,Ex");

             nextop = F8;

@@ -2016,7 +2032,29 @@ uintptr_t dynarec64_0F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
             UADDLVQ_16(d1, d0);

             VMOVeD(q0, 0, d1, 0);

             break;

-

+        case 0xF7:

+            INST_NAME("MASKMOVQ Gm, Em");

+            nextop = F8;

+            GETGM(q0);

+            GETEM(q1, 0);

+            d0 = fpu_get_scratch(dyn);

+            d1 = fpu_get_scratch(dyn);

+            USHR_64(d1, q1, 7);

+            MOV32w(x1, 1);

+            VDUPB(d0, x1);

+            VAND(d1, d1, d0);

+            MOV32w(x1, 0xff);

+            VDUPB(d0, x1);

+            VMUL_8(d0, d0, d1); // d0 = byte selection bitmask

+            VAND(d1, q0, d0);   // d1 = masked Gm

+            LDx(x1, xRDI, 0);   // x1 = [rdi]

+            VMOVQDto(x2, d0, 0);

+            MVNx_REG(x2, x2);

+            ANDx_REG(x1, x1, x2); // x1 = clear selected bytes

+            VMOVQDto(x2, d1, 0);

+            ORRx_REG(x1, x1, x2);

+            STx(x1, xRDI, 0);

+            break;

         case 0xF8:

             INST_NAME("PSUBB Gm, Em");

             nextop = F8;

@@ -2038,20 +2076,19 @@ uintptr_t dynarec64_0F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
             GETEM(v1, 0);

             VSUB_32(v0, v0, v1);

             break;

-

-        case 0xFC:

-            INST_NAME("PADDB Gm, Em");

+        case 0xFB:

+            INST_NAME("PSUBQ Gm, Em");

             nextop = F8;

             GETGM(v0);

             GETEM(v1, 0);

-            VADD_8(v0, v0, v1);

+            SUB_64(v0, v0, v1);

             break;

-        case 0xFB:

-            INST_NAME("PSUBQ Gm, Em");

+        case 0xFC:

+            INST_NAME("PADDB Gm, Em");

             nextop = F8;

             GETGM(v0);

             GETEM(v1, 0);

-            SUB_64(v0, v0, v1);

+            VADD_8(v0, v0, v1);

             break;

         case 0xFD:

             INST_NAME("PADDW Gm, Em");