about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorphorcys <phorcys@126.com>2025-04-16 14:07:08 +0800
committerGitHub <noreply@github.com>2025-04-16 08:07:08 +0200
commit96080e48cffad038ea9092a82684cc1b5fb6be81 (patch)
tree72630ebc1b8c0f8302042151371f4656cbac970e /src
parent4695a4ff3c2132edea634305850b4653c2f0fd1a (diff)
downloadbox64-96080e48cffad038ea9092a82684cc1b5fb6be81.tar.gz
box64-96080e48cffad038ea9092a82684cc1b5fb6be81.zip
[LA64_DYNAREC] Add mmx pack/unpack ops. (#2536)
add PUNPCKL{BW,WD,DQ}, PUNPCKH{BW,WD,DQ} mmx ops.
  add PACKSSWB PACKUSWB PACKSSDW mmx ops.
  * fix some merge mistake in prev mmx commit.
Diffstat (limited to 'src')
-rw-r--r--src/dynarec/la64/dynarec_la64_0f.c92
1 files changed, 83 insertions, 9 deletions
diff --git a/src/dynarec/la64/dynarec_la64_0f.c b/src/dynarec/la64/dynarec_la64_0f.c
index 995e87f3..110b0252 100644
--- a/src/dynarec/la64/dynarec_la64_0f.c
+++ b/src/dynarec/la64/dynarec_la64_0f.c
@@ -692,6 +692,35 @@ uintptr_t dynarec64_0F(dynarec_la64_t* dyn, uintptr_t addr, uintptr_t ip, int ni
                 VFMAX_S(v0, v0, v1);
             }
             break;
+        case 0x60:
+            INST_NAME("PUNPCKLBW Gm,Em");
+            nextop = F8;
+            GETGM(v0);
+            GETEM(v1, 0);
+            VILVL_B(v0, v1, v0);
+            break;
+        case 0x61:
+            INST_NAME("PUNPCKLWD Gm,Em");
+            nextop = F8;
+            GETGM(v0);
+            GETEM(v1, 0);
+            VILVL_H(v0, v1, v0);
+            break;
+        case 0x62:
+            INST_NAME("PUNPCKLDQ Gm,Em");
+            nextop = F8;
+            GETGM(v0);
+            GETEM(v1, 0);
+            VEXTRINS_W(v0, v1, VEXTRINS_IMM_4_0(1, 0));
+            break;
+        case 0x63:
+            INST_NAME("PACKSSWB Gm,Em");
+            nextop = F8;
+            GETGM(v0);
+            GETEM(v1, 0);
+            VPACKEV_D(v0, v1, v0);
+            VSSRANI_B_H(v0, v0, 0);
+            break;
         case 0x64:
             INST_NAME("PCMPGTB Gm,Em");
             nextop = F8;
@@ -713,6 +742,48 @@ uintptr_t dynarec64_0F(dynarec_la64_t* dyn, uintptr_t addr, uintptr_t ip, int ni
             GETEM(v1, 0);
             VSLT_W(v0, v1, v0);
             break;
+        case 0x67:
+            INST_NAME("PACKUSWB Gm, Em");
+            nextop = F8;
+            GETGM(v0);
+            GETEM(v1, 0);
+            q0 = fpu_get_scratch(dyn);
+            VPACKEV_D(v0, v1, v0);
+            VSSRANI_BU_H(v0, v0, 0);
+            break;
+        case 0x68:
+            INST_NAME("PUNPCKHBW Gm,Em");
+            nextop = F8;
+            GETGM(v0);
+            GETEM(v1, 0);
+            VILVL_B(v0, v1, v0);
+            VEXTRINS_D(v0, v0, VEXTRINS_IMM_4_0(0, 1));
+            break;
+        case 0x69:
+            INST_NAME("PUNPCKHWD Gm,Em");
+            nextop = F8;
+            GETGM(v0);
+            GETEM(v1, 0);
+            VILVL_H(v0, v1, v0);
+            VEXTRINS_D(v0, v0, VEXTRINS_IMM_4_0(0, 1));
+            break;
+        case 0x6A:
+            INST_NAME("PUNPCKHDQ Gm,Em");
+            nextop = F8;
+            GETGM(v0);
+            GETEM(v1, 0);
+            VILVL_W(v0, v1, v0);
+            VEXTRINS_D(v0, v0, VEXTRINS_IMM_4_0(0, 1));
+            break;
+        case 0x6B:
+            INST_NAME("PACKSSDW Gm,Em");
+            nextop = F8;
+            GETGM(v0);
+            GETEM(v1, 0);
+            d0 = fpu_get_scratch(dyn);
+            VPACKEV_D(v0, v1, v0);
+            VSSRANI_H_W(v0, v0, 0);
+            break;
         case 0x6E:
             INST_NAME("MOVD Gm, Ed");
             nextop = F8;
@@ -877,6 +948,7 @@ uintptr_t dynarec64_0F(dynarec_la64_t* dyn, uintptr_t addr, uintptr_t ip, int ni
                 default:
                     DEFAULT;
             }
+            break;
         case 0x74:
             INST_NAME("PCMPEQB Gm,Em");
             nextop = F8;
@@ -1754,6 +1826,13 @@ uintptr_t dynarec64_0F(dynarec_la64_t* dyn, uintptr_t addr, uintptr_t ip, int ni
             GETEM(v1, 0);
             VANDN_V(v0, v0, v1);
             break;
+        case 0xE0:
+            INST_NAME("PAVGB Gm, Em");
+            nextop = F8;
+            GETGM(v0);
+            GETEM(v1, 0);
+            VAVGR_BU(v0, v0, v1);
+            break;
         case 0xE1:
             INST_NAME("PSRAW Gm,Em");
             nextop = F8;
@@ -1774,13 +1853,6 @@ 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;
@@ -1790,8 +1862,10 @@ uintptr_t dynarec64_0F(dynarec_la64_t* dyn, uintptr_t addr, uintptr_t ip, int ni
             break;
         case 0xE4:
             INST_NAME("PMULHUW Gm,Em");
-            q1 = fpu_get_scratch(dyn);
-            VMUH_HU(q0, v0, v1);
+            nextop = F8;
+            GETGM(v0);
+            GETEM(v1, 0);
+            VMUH_HU(v0, v0, v1);
             break;
         case 0xE5:
             INST_NAME("PMULHW Gm, Em");