diff options
| author | phorcys <phorcys@126.com> | 2025-04-22 19:26:51 +0800 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-04-22 13:26:51 +0200 |
| commit | 854f6675db48245ebb520b6f6a2caefeefc05e1c (patch) | |
| tree | 4331b0905bb4a950fd2ffbdfb6ae024923b7f624 /src | |
| parent | fc15743ff9ecd68cca347b440c5514cafcc09473 (diff) | |
| download | box64-854f6675db48245ebb520b6f6a2caefeefc05e1c.tar.gz box64-854f6675db48245ebb520b6f6a2caefeefc05e1c.zip | |
[LA64_DYNAREC] Add SSSE3's mmx ops. (#2559)
0f.38.00 PSHUFB
01 PHADDW
02 PHADDD
03 PHADDSW
04 PMADDUBSW
05 PHSUBW
06 PHSUBD
07 PHSUBSW
08 PSIGNB
09 PSIGNW
0a PSIGND
0b PMULHRSW
1c PABSB
1d PABSW
1e PABSDDiffstat (limited to 'src')
| -rw-r--r-- | src/dynarec/la64/dynarec_la64_0f.c | 162 |
1 files changed, 162 insertions, 0 deletions
diff --git a/src/dynarec/la64/dynarec_la64_0f.c b/src/dynarec/la64/dynarec_la64_0f.c index dd6639a2..f420d942 100644 --- a/src/dynarec/la64/dynarec_la64_0f.c +++ b/src/dynarec/la64/dynarec_la64_0f.c @@ -434,6 +434,168 @@ uintptr_t dynarec64_0F(dynarec_la64_t* dyn, uintptr_t addr, uintptr_t ip, int ni // SSE3 nextop = F8; switch (nextop) { + case 0x00: + INST_NAME("PSHUFB Gm, Em"); + nextop = F8; + GETGM(q0); + GETEM(q1, 0); + v0 = fpu_get_scratch(dyn); + v1 = fpu_get_scratch(dyn); + d0 = fpu_get_scratch(dyn); + VLDI(v0, 0b0000010000111); // broadcast 0b10000111 as byte + VAND_V(v0, v0, q1); + VMINI_BU(v0, v0, 0x1f); + VXOR_V(v1, v1, v1); + VSHUF_B(q0, v1, q0, v0); + break; + case 0x01: + INST_NAME("PHADDW Gm, Em"); + nextop = F8; + GETGM(q0); + GETEM(q1, 0); + v0 = fpu_get_scratch(dyn); + v1 = fpu_get_scratch(dyn); + VPICKEV_H(v0, q1, q0); + VPICKOD_H(v1, q1, q0); + VADD_H(q0, v1, v0); + VSHUF4I_W(q0, q0, 0b11011000); + break; + case 0x2: + INST_NAME("PHADDD Gm, Em"); + nextop = F8; + GETGM(q0); + GETEM(q1, 0); + v0 = fpu_get_scratch(dyn); + v1 = fpu_get_scratch(dyn); + VPICKEV_W(v0, q1, q0); + VPICKOD_W(v1, q1, q0); + VADD_W(q0, v0, v1); + VSHUF4I_W(q0, q0, 0b11011000); + break; + case 0x03: + INST_NAME("PHADDSW Gm, Em"); + nextop = F8; + GETGM(q0); + GETEM(q1, 0); + v0 = fpu_get_scratch(dyn); + v1 = fpu_get_scratch(dyn); + VPICKEV_H(v0, q1, q0); + VPICKOD_H(v1, q1, q0); + VSADD_H(q0, v0, v1); + VSHUF4I_W(q0, q0, 0b11011000); + break; + case 0x04: + INST_NAME("PMADDUBSW Gm,Em"); + nextop = F8; + GETGM(q0); + GETEM(q1, 0); + v0 = fpu_get_scratch(dyn); + v1 = fpu_get_scratch(dyn); + VEXT2XV_HU_BU(v0, q0); + VEXT2XV_H_B(v1, q1); + XVMUL_H(v0, v0, v1); + VPICKEV_H(q0, v1, v0); + VPICKOD_H(v0, v1, v0); + VSADD_H(q0, v0, q0); + break; + case 0x05: + INST_NAME("PHSUBW Gm,Em"); + nextop = F8; + GETGM(q0); + GETEM(q1, 0); + v0 = fpu_get_scratch(dyn); + v1 = fpu_get_scratch(dyn); + VPICKEV_H(v0, q1, q0); + VPICKOD_H(v1, q1, q0); + VSUB_H(q0, v0, v1); + VSHUF4I_W(q0, q0, 0b11011000); + break; + case 0x06: + INST_NAME("PHSUBD Gm,Em"); + nextop = F8; + GETGM(q0); + GETEM(q1, 0); + v0 = fpu_get_scratch(dyn); + v1 = fpu_get_scratch(dyn); + VPICKEV_W(v0, q1, q0); + VPICKOD_W(v1, q1, q0); + VSUB_W(q0, v0, v1); + VSHUF4I_W(q0, q0, 0b11011000); + break; + case 0x07: + INST_NAME("PHSUBSW Gm,Em"); + nextop = F8; + GETGM(q0); + GETEM(q1, 0); + v0 = fpu_get_scratch(dyn); + v1 = fpu_get_scratch(dyn); + VPICKEV_H(v0, q1, q0); + VPICKOD_H(v1, q1, q0); + VSSUB_H(q0, v0, v1); + VSHUF4I_W(q0, q0, 0b11011000); + break; + case 0x08: + INST_NAME("PSIGNB Gm,Em"); + nextop = F8; + GETGM(q0); + GETEM(q1, 0); + VSIGNCOV_B(q0, q1, q0); + break; + case 0x09: + INST_NAME("PSIGNW Gm,Em"); + nextop = F8; + GETGM(q0); + GETEM(q1, 0); + VSIGNCOV_H(q0, q1, q0); + break; + case 0x0A: + INST_NAME("PSIGND Gm,Em"); + nextop = F8; + GETGM(q0); + GETEM(q1, 0); + VSIGNCOV_W(q0, q1, q0); + break; + case 0x0B: + INST_NAME("PMULHRSW Gm,Em"); + nextop = F8; + GETGM(q0); + GETEM(q1, 0); + v0 = fpu_get_scratch(dyn); + v1 = fpu_get_scratch(dyn); + VEXT2XV_W_H(v0, q0); + VEXT2XV_W_H(v1, q1); + XVMUL_W(v0, v0, v1); + VSRLI_W(v0, v0, 14); + VADDI_WU(v0, v0, 1); + VSRLNI_H_W(q0, v0, 1); + break; + case 0x1C: + INST_NAME("PABSB Gm,Em"); + nextop = F8; + GETGM(q0); + GETEM(q1, 0); + v0 = fpu_get_scratch(dyn); + VXOR_V(v0, v0, v0); + VABSD_B(q0, q1, v0); + break; + case 0x1D: + INST_NAME("PABSW Gm,Em"); + nextop = F8; + GETGM(q0); + GETEM(q1, 0); + v0 = fpu_get_scratch(dyn); + VXOR_V(v0, v0, v0); + VABSD_H(q0, q1, v0); + break; + case 0x1E: + INST_NAME("PABSD Gm,Em"); + nextop = F8; + GETGM(q0); + GETEM(q1, 0); + v0 = fpu_get_scratch(dyn); + VXOR_V(v0, v0, v0); + VABSD_W(q0, q1, v0); + break; case 0xC8 ... 0xCD: u8 = nextop; switch (u8) { |