From 17e28ae85d2e01261702246f92eeaec5b0b68ea3 Mon Sep 17 00:00:00 2001 From: Elad Ashkenazi Date: Fri, 10 Jun 2022 13:34:12 +0300 Subject: [PATCH] SPU LLVM: Improve expression matching detection for moved registers --- rpcs3/Emu/Cell/SPURecompiler.cpp | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/rpcs3/Emu/Cell/SPURecompiler.cpp b/rpcs3/Emu/Cell/SPURecompiler.cpp index 421583bdf5..11089f4649 100644 --- a/rpcs3/Emu/Cell/SPURecompiler.cpp +++ b/rpcs3/Emu/Cell/SPURecompiler.cpp @@ -7042,7 +7042,7 @@ public: void SHLQBYI(spu_opcode_t op) { - if (!m_interp_magn && !op.i7) return set_vr(op.rt, get_vr(op.ra)); // For expressions matching + if (get_reg_raw(op.ra) && !op.i7) return set_reg_fixed(op.rt, get_reg_raw(op.ra), false); // For expressions matching const auto a = get_vr(op.ra); const auto sc = build(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15); const auto sh = sc - (get_imm(op.i7, false) & 0x1f); @@ -7270,19 +7270,19 @@ public: void ORI(spu_opcode_t op) { - if (!m_interp_magn && !op.si10) return set_vr(op.rt, get_vr(op.ra)); // For expressions matching + if (get_reg_raw(op.ra) && !op.si10) return set_reg_fixed(op.rt, get_reg_raw(op.ra), false); // For expressions matching set_vr(op.rt, get_vr(op.ra) | get_imm(op.si10)); } void ORHI(spu_opcode_t op) { - if (!m_interp_magn && !op.si10) return set_vr(op.rt, get_vr(op.ra)); + if (get_reg_raw(op.ra) && !op.si10) return set_reg_fixed(op.rt, get_reg_raw(op.ra), false); set_vr(op.rt, get_vr(op.ra) | get_imm(op.si10)); } void ORBI(spu_opcode_t op) { - if (!m_interp_magn && !op.si10) return set_vr(op.rt, get_vr(op.ra)); + if (get_reg_raw(op.ra) && !op.si10) return set_reg_fixed(op.rt, get_reg_raw(op.ra), false); set_vr(op.rt, get_vr(op.ra) | get_imm(op.si10)); } @@ -7298,49 +7298,49 @@ public: void ANDI(spu_opcode_t op) { - if (!m_interp_magn && op.si10 == -1) return set_vr(op.rt, get_vr(op.ra)); + if (get_reg_raw(op.ra) && op.si10 == -1) return set_reg_fixed(op.rt, get_reg_raw(op.ra), false); set_vr(op.rt, get_vr(op.ra) & get_imm(op.si10)); } void ANDHI(spu_opcode_t op) { - if (!m_interp_magn && op.si10 == -1) return set_vr(op.rt, get_vr(op.ra)); + if (get_reg_raw(op.ra) && op.si10 == -1) return set_reg_fixed(op.rt, get_reg_raw(op.ra), false); set_vr(op.rt, get_vr(op.ra) & get_imm(op.si10)); } void ANDBI(spu_opcode_t op) { - if (!m_interp_magn && static_cast(op.si10) == -1) return set_vr(op.rt, get_vr(op.ra)); + if (get_reg_raw(op.ra) && static_cast(op.si10) == -1) return set_reg_fixed(op.rt, get_reg_raw(op.ra), false); set_vr(op.rt, get_vr(op.ra) & get_imm(op.si10)); } void AI(spu_opcode_t op) { - if (!m_interp_magn && !op.si10) return set_vr(op.rt, get_vr(op.ra)); + if (get_reg_raw(op.ra) && !op.si10) return set_reg_fixed(op.rt, get_reg_raw(op.ra), false); set_vr(op.rt, get_vr(op.ra) + get_imm(op.si10)); } void AHI(spu_opcode_t op) { - if (!m_interp_magn && !op.si10) return set_vr(op.rt, get_vr(op.ra)); + if (get_reg_raw(op.ra) && !op.si10) return set_reg_fixed(op.rt, get_reg_raw(op.ra), false); set_vr(op.rt, get_vr(op.ra) + get_imm(op.si10)); } void XORI(spu_opcode_t op) { - if (!m_interp_magn && !op.si10) return set_vr(op.rt, get_vr(op.ra)); + if (get_reg_raw(op.ra) && !op.si10) return set_reg_fixed(op.rt, get_reg_raw(op.ra), false); set_vr(op.rt, get_vr(op.ra) ^ get_imm(op.si10)); } void XORHI(spu_opcode_t op) { - if (!m_interp_magn && !op.si10) return set_vr(op.rt, get_vr(op.ra)); + if (get_reg_raw(op.ra) && !op.si10) return set_reg_fixed(op.rt, get_reg_raw(op.ra), false); set_vr(op.rt, get_vr(op.ra) ^ get_imm(op.si10)); } void XORBI(spu_opcode_t op) { - if (!m_interp_magn && !op.si10) return set_vr(op.rt, get_vr(op.ra)); + if (get_reg_raw(op.ra) && !op.si10) return set_reg_fixed(op.rt, get_reg_raw(op.ra), false); set_vr(op.rt, get_vr(op.ra) ^ get_imm(op.si10)); }