diff options
| author | phorcys <phorcys@126.com> | 2025-04-16 14:07:08 +0800 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-04-16 08:07:08 +0200 |
| commit | 96080e48cffad038ea9092a82684cc1b5fb6be81 (patch) | |
| tree | 72630ebc1b8c0f8302042151371f4656cbac970e /src | |
| parent | 4695a4ff3c2132edea634305850b4653c2f0fd1a (diff) | |
| download | box64-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.c | 92 |
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"); |