diff options
| author | phorcys <phorcys@126.com> | 2025-04-14 19:30:37 +0800 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-04-14 13:30:37 +0200 |
| commit | f559bc48a491bf1a36713a38293fb6b100399198 (patch) | |
| tree | 4076fec3a131fcb85c1fbdbff0a4ea9dd5179feb /src | |
| parent | 0021fbbea3b958ab9b1d00eea7b1a67358ab2a92 (diff) | |
| download | box64-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.c | 71 |
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; |