about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorphorcys <phorcys@126.com>2025-04-14 19:30:37 +0800
committerGitHub <noreply@github.com>2025-04-14 13:30:37 +0200
commitf559bc48a491bf1a36713a38293fb6b100399198 (patch)
tree4076fec3a131fcb85c1fbdbff0a4ea9dd5179feb /src
parent0021fbbea3b958ab9b1d00eea7b1a67358ab2a92 (diff)
downloadbox64-f559bc48a491bf1a36713a38293fb6b100399198.tar.gz
box64-f559bc48a491bf1a36713a38293fb6b100399198.zip
[LA64_DYNAREC] Add mmx arith ops. (#2530)
Diffstat (limited to 'src')
-rw-r--r--src/dynarec/la64/dynarec_la64_0f.c71
1 files changed, 71 insertions, 0 deletions
diff --git a/src/dynarec/la64/dynarec_la64_0f.c b/src/dynarec/la64/dynarec_la64_0f.c
index 2f41cb56..15588efa 100644
--- a/src/dynarec/la64/dynarec_la64_0f.c
+++ b/src/dynarec/la64/dynarec_la64_0f.c
@@ -1633,6 +1633,13 @@ uintptr_t dynarec64_0F(dynarec_la64_t* dyn, uintptr_t addr, uintptr_t ip, int ni
             VSRL_D(d0, d0, d1);
             VAND_V(d0, d0, v0);
             break;
+        case 0xD4:
+            INST_NAME("PADDQ Gm,Em");
+            nextop = F8;
+            GETGM(v0);
+            GETEM(v1, 0);
+            VADD_D(v0, v0, v1);
+            break;
         case 0xD5:
             INST_NAME("PMULLW Gm, Em");
             nextop = F8;
@@ -1664,6 +1671,13 @@ uintptr_t dynarec64_0F(dynarec_la64_t* dyn, uintptr_t addr, uintptr_t ip, int ni
             GETEM(q1, 0);
             VSSUB_HU(q0, q0, q1);
             break;
+        case 0xDA:
+            INST_NAME("PMINUB Gm, Em");
+            nextop = F8;
+            GETGM(v0);
+            GETEM(v1, 0);
+            VMIN_BU(v0, v0, v1);
+            break;
         case 0xDB:
             INST_NAME("PAND Gm, Em");
             nextop = F8;
@@ -1685,6 +1699,13 @@ uintptr_t dynarec64_0F(dynarec_la64_t* dyn, uintptr_t addr, uintptr_t ip, int ni
             GETEM(q1, 0);
             VSADD_HU(q0, q0, q1);
             break;
+        case 0xDE:
+            INST_NAME("PMAXUB Gm, Em");
+            nextop = F8;
+            GETGM(d0);
+            GETEM(d1, 0);
+            VMAX_BU(d0, d0, d1);
+            break;
         case 0xDF:
             INST_NAME("PANDN Gm, Em");
             nextop = F8;
@@ -1712,6 +1733,25 @@ uintptr_t dynarec64_0F(dynarec_la64_t* dyn, uintptr_t addr, uintptr_t ip, int ni
             VREPLVEI_W(q0, q0, 0);
             VSRA_W(v0, v0, q0);
             break;
+        case 0xE0:
+            INST_NAME("PAVGB Gm, Em");
+            nextop = F8;
+            GETGM(v0);
+            GETEM(v1, 0);
+            VAVGR_BU(v0, v0, v1);
+            break;
+        case 0xE3:
+            INST_NAME("PAVGW Gm,Em");
+            nextop = F8;
+            GETGM(v0);
+            GETEM(v1, 0);
+            VAVG_HU(v0, v0, v1);
+            break;
+        case 0xE4:
+            INST_NAME("PMULHUW Gm,Em");
+            q1 = fpu_get_scratch(dyn);
+            VMUH_HU(q0, v0, v1);
+            break;
         case 0xE5:
             INST_NAME("PMULHW Gm, Em");
             nextop = F8;
@@ -1746,6 +1786,13 @@ uintptr_t dynarec64_0F(dynarec_la64_t* dyn, uintptr_t addr, uintptr_t ip, int ni
             GETEM(q0, 0);
             VSSUB_H(v0, v0, q0);
             break;
+        case 0xEA:
+            INST_NAME("PMINSW Gx,Ex");
+            nextop = F8;
+            GETGM(v0);
+            GETEM(v1, 0);
+            VMIN_H(v0, v0, v1);
+            break;
         case 0xEB:
             INST_NAME("POR Gm, Em");
             nextop = F8;
@@ -1767,6 +1814,13 @@ uintptr_t dynarec64_0F(dynarec_la64_t* dyn, uintptr_t addr, uintptr_t ip, int ni
             GETEM(d1, 0);
             VSADD_H(d0, d0, d1);
             break;
+        case 0xEE:
+            INST_NAME("PMAXSW Gm,Em");
+            nextop = F8;
+            GETGM(v0);
+            GETEM(v1, 0);
+            VMAX_H(v0, v0, v1);
+            break;
         case 0xEF:
             INST_NAME("PXOR Gm, Em");
             nextop = F8;
@@ -1809,6 +1863,13 @@ uintptr_t dynarec64_0F(dynarec_la64_t* dyn, uintptr_t addr, uintptr_t ip, int ni
             VSLL_D(d0, d0, d1);
             VAND_V(d0, d0, v0);
             break;
+        case 0xF4:
+            INST_NAME("PMULUDQ Gm,Em");
+            nextop = F8;
+            GETGM(v0);
+            GETEM(v1, 0);
+            VMULWEV_D_WU(v0, v0, v1);
+            break;
         case 0xF5:
             INST_NAME("PMADDWD Gm, Em");
             nextop = F8;
@@ -1820,6 +1881,16 @@ uintptr_t dynarec64_0F(dynarec_la64_t* dyn, uintptr_t addr, uintptr_t ip, int ni
             VMADDWOD_W_H(q0, v0, v1);
             VBSLL_V(v0, q0, 0);
             break;
+        case 0xF6:
+            INST_NAME("PSADBW Gm, Em");
+            nextop = F8;
+            GETGM(v0);
+            GETEM(v1, 0);
+            VABSD_BU(v0, v0, v1);
+            VHADDW_HU_BU(v0, v0, v0);
+            VHADDW_WU_HU(v0, v0, v0);
+            VHADDW_DU_WU(v0, v0, v0);
+            break;
         case 0xF7:
             INST_NAME("MASKMOVQ Gm, Em");
             nextop = F8;