about summary refs log tree commit diff stats
path: root/src
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
parent8e7afcc5fb6c320126c06bc46f7691fb2199634d (diff)
downloadbox64-cd0aad731adede316ea036692ef92669474c1256.tar.gz
box64-cd0aad731adede316ea036692ef92669474c1256.zip
[ARM64_DYNAREC] Added 0F F1/F3/F7 opcodes
Diffstat (limited to 'src')
-rw-r--r--src/dynarec/arm64/dynarec_arm64_0f.c55
-rw-r--r--src/emu/x64run0f.c11
2 files changed, 56 insertions, 10 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");

diff --git a/src/emu/x64run0f.c b/src/emu/x64run0f.c
index 466220bc..a05b3596 100644
--- a/src/emu/x64run0f.c
+++ b/src/emu/x64run0f.c
@@ -1734,7 +1734,16 @@ uintptr_t Run0F(x64emu_t *emu, rex_t rex, uintptr_t addr, int *step)
                 tmp32u += (GM->ub[i]>EM->ub[i])?(GM->ub[i] - EM->ub[i]):(EM->ub[i] - GM->ub[i]);

             GM->q = tmp32u;

             break;

-

+        case 0xF7:                   /* MASKMOVQ Gm, Em */

+            nextop = F8;

+            GETEM(0);

+            GETGM;

+            for (int i = 0; i < 8; i++) {

+                if (EM->ub[i] & 0x80) {

+                   ((reg64_t*)(emu->regs[_DI].q[0]))->byte[i] = GM->ub[i];

+                }

+            }

+            break;

         case 0xF8:                   /* PSUBB Gm,Em */

             nextop = F8;

             GETEM(0);