From 0e5514003aed8fe6f363b4767dbc5f22913441c0 Mon Sep 17 00:00:00 2001 From: Malcolm Jestadt Date: Thu, 2 Jun 2022 21:37:40 -0400 Subject: [PATCH] SPU LLVM: Optimize LQR/STQR - Avoid type mismatch between adds that prevented llvm from combining the operations --- rpcs3/Emu/Cell/SPURecompiler.cpp | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/rpcs3/Emu/Cell/SPURecompiler.cpp b/rpcs3/Emu/Cell/SPURecompiler.cpp index 162aba59fc..912b62b4b6 100644 --- a/rpcs3/Emu/Cell/SPURecompiler.cpp +++ b/rpcs3/Emu/Cell/SPURecompiler.cpp @@ -9011,10 +9011,15 @@ public: set_vr(op.rt, make_load_ls(addr)); } + llvm::Value* get_pc_as_u64(u32 addr) + { + return m_ir->CreateAdd(m_ir->CreateZExt(m_base_pc, get_type()), m_ir->getInt64(addr - m_base)); + } + void STQR(spu_opcode_t op) // { value_t addr; - addr.value = m_ir->CreateZExt(m_interp_magn ? m_interp_pc : get_pc(m_pos), get_type()); + addr.value = m_interp_magn ? m_ir->CreateZExt(m_interp_pc, get_type()) : get_pc_as_u64(m_pos); addr = eval(((get_imm(op.i16, false) << 2) + addr) & (m_interp_magn ? 0x3fff0 : ~0xf)); make_store_ls(addr, get_vr(op.rt)); } @@ -9022,7 +9027,7 @@ public: void LQR(spu_opcode_t op) // { value_t addr; - addr.value = m_ir->CreateZExt(m_interp_magn ? m_interp_pc : get_pc(m_pos), get_type()); + addr.value = m_interp_magn ? m_ir->CreateZExt(m_interp_pc, get_type()) : get_pc_as_u64(m_pos); addr = eval(((get_imm(op.i16, false) << 2) + addr) & (m_interp_magn ? 0x3fff0 : ~0xf)); set_vr(op.rt, make_load_ls(addr)); }