diff options
| author | Yang Liu <liuyang22@iscas.ac.cn> | 2025-07-15 17:29:34 +0800 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-07-15 11:29:34 +0200 |
| commit | 98f2460c46347d59aa3a01b0c0a19bc9f7bc6ffb (patch) | |
| tree | cc39be4671a74e151af8b81b9ae6a2e3ecd1416f /src | |
| parent | 7a4583699b5e54f5e4efe23c7920cf2993e3e1f9 (diff) | |
| download | box64-98f2460c46347d59aa3a01b0c0a19bc9f7bc6ffb.tar.gz box64-98f2460c46347d59aa3a01b0c0a19bc9f7bc6ffb.zip | |
[LA64_DYNAREC] Optimized PMADDUBSW opcodes (#2817)
Diffstat (limited to 'src')
| -rw-r--r-- | src/dynarec/la64/dynarec_la64_0f.c | 31 | ||||
| -rw-r--r-- | src/dynarec/la64/dynarec_la64_660f.c | 12 |
2 files changed, 18 insertions, 25 deletions
diff --git a/src/dynarec/la64/dynarec_la64_0f.c b/src/dynarec/la64/dynarec_la64_0f.c index 2d009170..bbe42e3c 100644 --- a/src/dynarec/la64/dynarec_la64_0f.c +++ b/src/dynarec/la64/dynarec_la64_0f.c @@ -485,21 +485,18 @@ uintptr_t dynarec64_0F(dynarec_la64_t* dyn, uintptr_t addr, uintptr_t ip, int ni VSHUF4I_W(q0, q0, 0b11011000); break; case 0x04: - INST_NAME("PMADDUBSW Gm,Em"); + 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); + VMULWEV_H_BU_B(v0, q0, q1); + VMULWOD_H_BU_B(v1, q0, q1); + VSADD_H(q0, v0, v1); break; case 0x05: - INST_NAME("PHSUBW Gm,Em"); + INST_NAME("PHSUBW Gm, Em"); nextop = F8; GETGM(q0); GETEM(q1, 0); @@ -511,7 +508,7 @@ uintptr_t dynarec64_0F(dynarec_la64_t* dyn, uintptr_t addr, uintptr_t ip, int ni VSHUF4I_W(q0, q0, 0b11011000); break; case 0x06: - INST_NAME("PHSUBD Gm,Em"); + INST_NAME("PHSUBD Gm, Em"); nextop = F8; GETGM(q0); GETEM(q1, 0); @@ -523,7 +520,7 @@ uintptr_t dynarec64_0F(dynarec_la64_t* dyn, uintptr_t addr, uintptr_t ip, int ni VSHUF4I_W(q0, q0, 0b11011000); break; case 0x07: - INST_NAME("PHSUBSW Gm,Em"); + INST_NAME("PHSUBSW Gm, Em"); nextop = F8; GETGM(q0); GETEM(q1, 0); @@ -535,28 +532,28 @@ uintptr_t dynarec64_0F(dynarec_la64_t* dyn, uintptr_t addr, uintptr_t ip, int ni VSHUF4I_W(q0, q0, 0b11011000); break; case 0x08: - INST_NAME("PSIGNB Gm,Em"); + 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"); + 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"); + 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"); + INST_NAME("PMULHRSW Gm, Em"); nextop = F8; GETGM(q0); GETEM(q1, 0); @@ -570,7 +567,7 @@ uintptr_t dynarec64_0F(dynarec_la64_t* dyn, uintptr_t addr, uintptr_t ip, int ni VSRLNI_H_W(q0, v0, 1); break; case 0x1C: - INST_NAME("PABSB Gm,Em"); + INST_NAME("PABSB Gm, Em"); nextop = F8; GETGM(q0); GETEM(q1, 0); @@ -579,7 +576,7 @@ uintptr_t dynarec64_0F(dynarec_la64_t* dyn, uintptr_t addr, uintptr_t ip, int ni VABSD_B(q0, q1, v0); break; case 0x1D: - INST_NAME("PABSW Gm,Em"); + INST_NAME("PABSW Gm, Em"); nextop = F8; GETGM(q0); GETEM(q1, 0); @@ -588,7 +585,7 @@ uintptr_t dynarec64_0F(dynarec_la64_t* dyn, uintptr_t addr, uintptr_t ip, int ni VABSD_H(q0, q1, v0); break; case 0x1E: - INST_NAME("PABSD Gm,Em"); + INST_NAME("PABSD Gm, Em"); nextop = F8; GETGM(q0); GETEM(q1, 0); diff --git a/src/dynarec/la64/dynarec_la64_660f.c b/src/dynarec/la64/dynarec_la64_660f.c index e4fca3c4..741fde0d 100644 --- a/src/dynarec/la64/dynarec_la64_660f.c +++ b/src/dynarec/la64/dynarec_la64_660f.c @@ -400,19 +400,15 @@ uintptr_t dynarec64_660F(dynarec_la64_t* dyn, uintptr_t addr, uintptr_t ip, int VSADD_H(q0, v0, v1); break; case 0x04: - INST_NAME("PMADDUBSW Gx,Ex"); + INST_NAME("PMADDUBSW Gx, Ex"); nextop = F8; GETGX(q0, 1); GETEX(q1, 0, 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); - XVPERMI_Q(v1, v0, 1); // v1[127:0] = v0[255:128]; - VPICKEV_H(q0, v1, v0); - VPICKOD_H(v0, v1, v0); - VSADD_H(q0, v0, q0); + VMULWEV_H_BU_B(v0, q0, q1); + VMULWOD_H_BU_B(v1, q0, q1); + VSADD_H(q0, v0, v1); break; case 0x05: INST_NAME("PHSUBW Gx, Ex"); |